Loading Documentation/scsi/LICENSE.qla2xxx 0 → 100644 +45 −0 Original line number Original line Diff line number Diff line Copyright (c) 2003-2005 QLogic Corporation QLogic Linux Fibre Channel HBA Driver This program includes a device driver for Linux 2.6 that may be distributed with QLogic hardware specific firmware binary file. You may modify and redistribute the device driver code under the GNU General Public License as published by the Free Software Foundation (version 2 or a later version). You may redistribute the hardware specific firmware binary file under the following terms: 1. Redistribution of source code (only if applicable), must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistribution in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of QLogic Corporation may not be used to endorse or promote products derived from this software without specific prior written permission REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE, THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT, TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN COMBINATION WITH THIS PROGRAM. drivers/message/fusion/mptbase.h +14 −2 Original line number Original line Diff line number Diff line Loading @@ -77,8 +77,8 @@ #define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR #define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR #endif #endif #define MPT_LINUX_VERSION_COMMON "3.03.03" #define MPT_LINUX_VERSION_COMMON "3.03.04" #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.03.03" #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.03.04" #define WHAT_MAGIC_STRING "@" "(" "#" ")" #define WHAT_MAGIC_STRING "@" "(" "#" ")" #define show_mptmod_ver(s,ver) \ #define show_mptmod_ver(s,ver) \ Loading Loading @@ -421,6 +421,17 @@ typedef struct _MPT_IOCTL { struct semaphore sem_ioc; struct semaphore sem_ioc; } MPT_IOCTL; } MPT_IOCTL; #define MPT_SAS_MGMT_STATUS_RF_VALID 0x02 /* The Reply Frame is VALID */ #define MPT_SAS_MGMT_STATUS_COMMAND_GOOD 0x10 /* Command Status GOOD */ #define MPT_SAS_MGMT_STATUS_TM_FAILED 0x40 /* User TM request failed */ typedef struct _MPT_SAS_MGMT { struct semaphore mutex; struct completion done; u8 reply[MPT_DEFAULT_FRAME_SIZE]; /* reply frame data */ u8 status; /* current command status */ }MPT_SAS_MGMT; /* /* * Event Structure and define * Event Structure and define */ */ Loading Loading @@ -604,6 +615,7 @@ typedef struct _MPT_ADAPTER struct list_head list; struct list_head list; struct net_device *netdev; struct net_device *netdev; struct list_head sas_topology; struct list_head sas_topology; MPT_SAS_MGMT sas_mgmt; } MPT_ADAPTER; } MPT_ADAPTER; /* /* Loading drivers/message/fusion/mptsas.c +249 −74 Original line number Original line Diff line number Diff line Loading @@ -83,6 +83,7 @@ MODULE_PARM_DESC(mpt_pt_clear, static int mptsasDoneCtx = -1; static int mptsasDoneCtx = -1; static int mptsasTaskCtx = -1; static int mptsasTaskCtx = -1; static int mptsasInternalCtx = -1; /* Used only for internal commands */ static int mptsasInternalCtx = -1; /* Used only for internal commands */ static int mptsasMgmtCtx = -1; /* /* Loading Loading @@ -123,6 +124,104 @@ struct mptsas_portinfo { struct mptsas_phyinfo *phy_info; struct mptsas_phyinfo *phy_info; }; }; #ifdef SASDEBUG static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data) { printk("---- IO UNIT PAGE 0 ------------\n"); printk("Handle=0x%X\n", le16_to_cpu(phy_data->AttachedDeviceHandle)); printk("Controller Handle=0x%X\n", le16_to_cpu(phy_data->ControllerDevHandle)); printk("Port=0x%X\n", phy_data->Port); printk("Port Flags=0x%X\n", phy_data->PortFlags); printk("PHY Flags=0x%X\n", phy_data->PhyFlags); printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate); printk("Controller PHY Device Info=0x%X\n", le32_to_cpu(phy_data->ControllerPhyDeviceInfo)); printk("DiscoveryStatus=0x%X\n", le32_to_cpu(phy_data->DiscoveryStatus)); printk("\n"); } static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0) { __le64 sas_address; memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); printk("---- SAS PHY PAGE 0 ------------\n"); printk("Attached Device Handle=0x%X\n", le16_to_cpu(pg0->AttachedDevHandle)); printk("SAS Address=0x%llX\n", (unsigned long long)le64_to_cpu(sas_address)); printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier); printk("Attached Device Info=0x%X\n", le32_to_cpu(pg0->AttachedDeviceInfo)); printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate); printk("Change Count=0x%X\n", pg0->ChangeCount); printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo)); printk("\n"); } static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1) { printk("---- SAS PHY PAGE 1 ------------\n"); printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount); printk("Running Disparity Error Count=0x%x\n", pg1->RunningDisparityErrorCount); printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount); printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount); printk("\n"); } static void mptsas_print_device_pg0(SasDevicePage0_t *pg0) { __le64 sas_address; memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); printk("---- SAS DEVICE PAGE 0 ---------\n"); printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)); printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)); printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot)); printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address)); printk("Target ID=0x%X\n", pg0->TargetID); printk("Bus=0x%X\n", pg0->Bus); /* The PhyNum field specifies the PHY number of the parent * device this device is linked to */ printk("Parent Phy Num=0x%X\n", pg0->PhyNum); printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus)); printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)); printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags)); printk("Physical Port=0x%X\n", pg0->PhysicalPort); printk("\n"); } static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1) { printk("---- SAS EXPANDER PAGE 1 ------------\n"); printk("Physical Port=0x%X\n", pg1->PhysicalPort); printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier); printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate); printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate); printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate); printk("Owner Device Handle=0x%X\n", le16_to_cpu(pg1->OwnerDevHandle)); printk("Attached Device Handle=0x%X\n", le16_to_cpu(pg1->AttachedDevHandle)); } #else #define mptsas_print_phy_data(phy_data) do { } while (0) #define mptsas_print_phy_pg0(pg0) do { } while (0) #define mptsas_print_phy_pg1(pg1) do { } while (0) #define mptsas_print_device_pg0(pg0) do { } while (0) #define mptsas_print_expander_pg1(pg1) do { } while (0) #endif /* /* * This is pretty ugly. We will be able to seriously clean it up * This is pretty ugly. We will be able to seriously clean it up * once the DV code in mptscsih goes away and we can properly * once the DV code in mptscsih goes away and we can properly Loading Loading @@ -200,91 +299,159 @@ static struct scsi_host_template mptsas_driver_template = { .use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING, }; }; static struct sas_function_template mptsas_transport_functions = { static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy) }; static struct scsi_transport_template *mptsas_transport_template; #ifdef SASDEBUG static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data) { { printk("---- IO UNIT PAGE 0 ------------\n"); struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); printk("Handle=0x%X\n", return ((MPT_SCSI_HOST *)shost->hostdata)->ioc; le16_to_cpu(phy_data->AttachedDeviceHandle)); printk("Controller Handle=0x%X\n", le16_to_cpu(phy_data->ControllerDevHandle)); printk("Port=0x%X\n", phy_data->Port); printk("Port Flags=0x%X\n", phy_data->PortFlags); printk("PHY Flags=0x%X\n", phy_data->PhyFlags); printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate); printk("Controller PHY Device Info=0x%X\n", le32_to_cpu(phy_data->ControllerPhyDeviceInfo)); printk("DiscoveryStatus=0x%X\n", le32_to_cpu(phy_data->DiscoveryStatus)); printk("\n"); } } static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0) static int mptsas_get_linkerrors(struct sas_phy *phy) { { __le64 sas_address; MPT_ADAPTER *ioc = phy_to_ioc(phy); ConfigExtendedPageHeader_t hdr; CONFIGPARMS cfg; SasPhyPage1_t *buffer; dma_addr_t dma_handle; int error; memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); hdr.PageVersion = MPI_SASPHY1_PAGEVERSION; hdr.ExtPageLength = 0; hdr.PageNumber = 1 /* page number 1*/; hdr.Reserved1 = 0; hdr.Reserved2 = 0; hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED; hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY; printk("---- SAS PHY PAGE 0 ------------\n"); cfg.cfghdr.ehdr = &hdr; printk("Attached Device Handle=0x%X\n", cfg.physAddr = -1; le16_to_cpu(pg0->AttachedDevHandle)); cfg.pageAddr = phy->identify.phy_identifier; printk("SAS Address=0x%llX\n", cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; (unsigned long long)le64_to_cpu(sas_address)); cfg.dir = 0; /* read */ printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier); cfg.timeout = 10; printk("Attached Device Info=0x%X\n", le32_to_cpu(pg0->AttachedDeviceInfo)); error = mpt_config(ioc, &cfg); printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate); if (error) printk("Change Count=0x%X\n", pg0->ChangeCount); return error; printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo)); if (!hdr.ExtPageLength) printk("\n"); return -ENXIO; buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4, &dma_handle); if (!buffer) return -ENOMEM; cfg.physAddr = dma_handle; cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; error = mpt_config(ioc, &cfg); if (error) goto out_free_consistent; mptsas_print_phy_pg1(buffer); phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount); phy->running_disparity_error_count = le32_to_cpu(buffer->RunningDisparityErrorCount); phy->loss_of_dword_sync_count = le32_to_cpu(buffer->LossDwordSynchCount); phy->phy_reset_problem_count = le32_to_cpu(buffer->PhyResetProblemCount); out_free_consistent: pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, buffer, dma_handle); return error; } } static void mptsas_print_device_pg0(SasDevicePage0_t *pg0) static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply) { { __le64 sas_address; ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_COMMAND_GOOD; if (reply != NULL) { ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_RF_VALID; memcpy(ioc->sas_mgmt.reply, reply, min(ioc->reply_sz, 4 * reply->u.reply.MsgLength)); } complete(&ioc->sas_mgmt.done); return 1; } memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset) { MPT_ADAPTER *ioc = phy_to_ioc(phy); SasIoUnitControlRequest_t *req; SasIoUnitControlReply_t *reply; MPT_FRAME_HDR *mf; MPIHeader_t *hdr; unsigned long timeleft; int error = -ERESTARTSYS; /* not implemented for expanders */ if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP) return -ENXIO; if (down_interruptible(&ioc->sas_mgmt.mutex)) goto out; printk("---- SAS DEVICE PAGE 0 ---------\n"); mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc); printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)); if (!mf) { printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)); error = -ENOMEM; printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot)); goto out_unlock; printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address)); printk("Target ID=0x%X\n", pg0->TargetID); printk("Bus=0x%X\n", pg0->Bus); printk("Parent Phy Num=0x%X\n", pg0->PhyNum); printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus)); printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)); printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags)); printk("Physical Port=0x%X\n", pg0->PhysicalPort); printk("\n"); } } static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1) hdr = (MPIHeader_t *) mf; { req = (SasIoUnitControlRequest_t *)mf; printk("---- SAS EXPANDER PAGE 1 ------------\n"); memset(req, 0, sizeof(SasIoUnitControlRequest_t)); req->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; req->MsgContext = hdr->MsgContext; req->Operation = hard_reset ? MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET; req->PhyNum = phy->identify.phy_identifier; printk("Physical Port=0x%X\n", pg1->PhysicalPort); mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf); printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier); printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate); timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate); 10 * HZ); printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate); if (!timeleft) { printk("Owner Device Handle=0x%X\n", /* On timeout reset the board */ le16_to_cpu(pg1->OwnerDevHandle)); mpt_free_msg_frame(ioc, mf); printk("Attached Device Handle=0x%X\n", mpt_HardResetHandler(ioc, CAN_SLEEP); le16_to_cpu(pg1->AttachedDevHandle)); error = -ETIMEDOUT; goto out_unlock; } } #else #define mptsas_print_phy_data(phy_data) do { } while (0) /* a reply frame is expected */ #define mptsas_print_phy_pg0(pg0) do { } while (0) if ((ioc->sas_mgmt.status & #define mptsas_print_device_pg0(pg0) do { } while (0) MPT_IOCTL_STATUS_RF_VALID) == 0) { #define mptsas_print_expander_pg1(pg1) do { } while (0) error = -ENXIO; #endif goto out_unlock; } /* process the completed Reply Message Frame */ reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply; if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) { printk("%s: IOCStatus=0x%X IOCLogInfo=0x%X\n", __FUNCTION__, reply->IOCStatus, reply->IOCLogInfo); error = -ENXIO; goto out_unlock; } error = 0; out_unlock: up(&ioc->sas_mgmt.mutex); out: return error; } static struct sas_function_template mptsas_transport_functions = { .get_linkerrors = mptsas_get_linkerrors, .phy_reset = mptsas_phy_reset, }; static struct scsi_transport_template *mptsas_transport_template; static int static int mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) Loading Loading @@ -680,7 +847,7 @@ mptsas_parse_device_info(struct sas_identify *identify, } } static int mptsas_probe_one_phy(struct device *dev, static int mptsas_probe_one_phy(struct device *dev, struct mptsas_phyinfo *phy_info, int index) struct mptsas_phyinfo *phy_info, int index, int local) { { struct sas_phy *port; struct sas_phy *port; int error; int error; Loading Loading @@ -773,6 +940,9 @@ static int mptsas_probe_one_phy(struct device *dev, break; break; } } if (local) port->local_attached = 1; error = sas_phy_add(port); error = sas_phy_add(port); if (error) { if (error) { sas_phy_free(port); sas_phy_free(port); Loading Loading @@ -838,7 +1008,7 @@ mptsas_probe_hba_phys(MPT_ADAPTER *ioc, int *index) } } mptsas_probe_one_phy(&ioc->sh->shost_gendev, mptsas_probe_one_phy(&ioc->sh->shost_gendev, &port_info->phy_info[i], *index); &port_info->phy_info[i], *index, 1); (*index)++; (*index)++; } } Loading Loading @@ -909,7 +1079,8 @@ mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle, int *index) } } } } mptsas_probe_one_phy(parent, &port_info->phy_info[i], *index); mptsas_probe_one_phy(parent, &port_info->phy_info[i], *index, 0); (*index)++; (*index)++; } } Loading Loading @@ -1021,6 +1192,8 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) sh->unique_id = ioc->id; sh->unique_id = ioc->id; INIT_LIST_HEAD(&ioc->sas_topology); INIT_LIST_HEAD(&ioc->sas_topology); init_MUTEX(&ioc->sas_mgmt.mutex); init_completion(&ioc->sas_mgmt.done); /* Verify that we won't exceed the maximum /* Verify that we won't exceed the maximum * number of chain buffers * number of chain buffers Loading Loading @@ -1207,6 +1380,7 @@ mptsas_init(void) mptsasTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSAS_DRIVER); mptsasTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSAS_DRIVER); mptsasInternalCtx = mptsasInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER); mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER); mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER); if (mpt_event_register(mptsasDoneCtx, mptscsih_event_process) == 0) { if (mpt_event_register(mptsasDoneCtx, mptscsih_event_process) == 0) { devtprintk((KERN_INFO MYNAM devtprintk((KERN_INFO MYNAM Loading @@ -1230,6 +1404,7 @@ mptsas_exit(void) mpt_reset_deregister(mptsasDoneCtx); mpt_reset_deregister(mptsasDoneCtx); mpt_event_deregister(mptsasDoneCtx); mpt_event_deregister(mptsasDoneCtx); mpt_deregister(mptsasMgmtCtx); mpt_deregister(mptsasInternalCtx); mpt_deregister(mptsasInternalCtx); mpt_deregister(mptsasTaskCtx); mpt_deregister(mptsasTaskCtx); mpt_deregister(mptsasDoneCtx); mpt_deregister(mptsasDoneCtx); Loading drivers/scsi/3w-9xxx.c +3 −1 Original line number Original line Diff line number Diff line Loading @@ -1732,7 +1732,9 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt) tw_dev->num_resets++; tw_dev->num_resets++; printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, TW_DRIVER, 0x2c, SCpnt->device->id, SCpnt->cmnd[0]); sdev_printk(KERN_WARNING, SCpnt->device, "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n", TW_DRIVER, 0x2c, SCpnt->cmnd[0]); /* Now reset the card and some of the device extension data */ /* Now reset the card and some of the device extension data */ if (twa_reset_device_extension(tw_dev, 0)) { if (twa_reset_device_extension(tw_dev, 0)) { Loading drivers/scsi/3w-xxxx.c +3 −1 Original line number Original line Diff line number Diff line Loading @@ -1432,7 +1432,9 @@ static int tw_scsi_eh_reset(struct scsi_cmnd *SCpnt) tw_dev->num_resets++; tw_dev->num_resets++; printk(KERN_WARNING "3w-xxxx: scsi%d: WARNING: Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, SCpnt->device->id, SCpnt->cmnd[0]); sdev_printk(KERN_WARNING, SCpnt->device, "WARNING: Command (0x%x) timed out, resetting card.\n", SCpnt->cmnd[0]); /* Now reset the card and some of the device extension data */ /* Now reset the card and some of the device extension data */ if (tw_reset_device_extension(tw_dev, 0)) { if (tw_reset_device_extension(tw_dev, 0)) { Loading Loading
Documentation/scsi/LICENSE.qla2xxx 0 → 100644 +45 −0 Original line number Original line Diff line number Diff line Copyright (c) 2003-2005 QLogic Corporation QLogic Linux Fibre Channel HBA Driver This program includes a device driver for Linux 2.6 that may be distributed with QLogic hardware specific firmware binary file. You may modify and redistribute the device driver code under the GNU General Public License as published by the Free Software Foundation (version 2 or a later version). You may redistribute the hardware specific firmware binary file under the following terms: 1. Redistribution of source code (only if applicable), must retain the above copyright notice, this list of conditions and the following disclaimer. 2. Redistribution in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. 3. The name of QLogic Corporation may not be used to endorse or promote products derived from this software without specific prior written permission REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE, THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT, TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN COMBINATION WITH THIS PROGRAM.
drivers/message/fusion/mptbase.h +14 −2 Original line number Original line Diff line number Diff line Loading @@ -77,8 +77,8 @@ #define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR #define COPYRIGHT "Copyright (c) 1999-2005 " MODULEAUTHOR #endif #endif #define MPT_LINUX_VERSION_COMMON "3.03.03" #define MPT_LINUX_VERSION_COMMON "3.03.04" #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.03.03" #define MPT_LINUX_PACKAGE_NAME "@(#)mptlinux-3.03.04" #define WHAT_MAGIC_STRING "@" "(" "#" ")" #define WHAT_MAGIC_STRING "@" "(" "#" ")" #define show_mptmod_ver(s,ver) \ #define show_mptmod_ver(s,ver) \ Loading Loading @@ -421,6 +421,17 @@ typedef struct _MPT_IOCTL { struct semaphore sem_ioc; struct semaphore sem_ioc; } MPT_IOCTL; } MPT_IOCTL; #define MPT_SAS_MGMT_STATUS_RF_VALID 0x02 /* The Reply Frame is VALID */ #define MPT_SAS_MGMT_STATUS_COMMAND_GOOD 0x10 /* Command Status GOOD */ #define MPT_SAS_MGMT_STATUS_TM_FAILED 0x40 /* User TM request failed */ typedef struct _MPT_SAS_MGMT { struct semaphore mutex; struct completion done; u8 reply[MPT_DEFAULT_FRAME_SIZE]; /* reply frame data */ u8 status; /* current command status */ }MPT_SAS_MGMT; /* /* * Event Structure and define * Event Structure and define */ */ Loading Loading @@ -604,6 +615,7 @@ typedef struct _MPT_ADAPTER struct list_head list; struct list_head list; struct net_device *netdev; struct net_device *netdev; struct list_head sas_topology; struct list_head sas_topology; MPT_SAS_MGMT sas_mgmt; } MPT_ADAPTER; } MPT_ADAPTER; /* /* Loading
drivers/message/fusion/mptsas.c +249 −74 Original line number Original line Diff line number Diff line Loading @@ -83,6 +83,7 @@ MODULE_PARM_DESC(mpt_pt_clear, static int mptsasDoneCtx = -1; static int mptsasDoneCtx = -1; static int mptsasTaskCtx = -1; static int mptsasTaskCtx = -1; static int mptsasInternalCtx = -1; /* Used only for internal commands */ static int mptsasInternalCtx = -1; /* Used only for internal commands */ static int mptsasMgmtCtx = -1; /* /* Loading Loading @@ -123,6 +124,104 @@ struct mptsas_portinfo { struct mptsas_phyinfo *phy_info; struct mptsas_phyinfo *phy_info; }; }; #ifdef SASDEBUG static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data) { printk("---- IO UNIT PAGE 0 ------------\n"); printk("Handle=0x%X\n", le16_to_cpu(phy_data->AttachedDeviceHandle)); printk("Controller Handle=0x%X\n", le16_to_cpu(phy_data->ControllerDevHandle)); printk("Port=0x%X\n", phy_data->Port); printk("Port Flags=0x%X\n", phy_data->PortFlags); printk("PHY Flags=0x%X\n", phy_data->PhyFlags); printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate); printk("Controller PHY Device Info=0x%X\n", le32_to_cpu(phy_data->ControllerPhyDeviceInfo)); printk("DiscoveryStatus=0x%X\n", le32_to_cpu(phy_data->DiscoveryStatus)); printk("\n"); } static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0) { __le64 sas_address; memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); printk("---- SAS PHY PAGE 0 ------------\n"); printk("Attached Device Handle=0x%X\n", le16_to_cpu(pg0->AttachedDevHandle)); printk("SAS Address=0x%llX\n", (unsigned long long)le64_to_cpu(sas_address)); printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier); printk("Attached Device Info=0x%X\n", le32_to_cpu(pg0->AttachedDeviceInfo)); printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate); printk("Change Count=0x%X\n", pg0->ChangeCount); printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo)); printk("\n"); } static void mptsas_print_phy_pg1(SasPhyPage1_t *pg1) { printk("---- SAS PHY PAGE 1 ------------\n"); printk("Invalid Dword Count=0x%x\n", pg1->InvalidDwordCount); printk("Running Disparity Error Count=0x%x\n", pg1->RunningDisparityErrorCount); printk("Loss Dword Synch Count=0x%x\n", pg1->LossDwordSynchCount); printk("PHY Reset Problem Count=0x%x\n", pg1->PhyResetProblemCount); printk("\n"); } static void mptsas_print_device_pg0(SasDevicePage0_t *pg0) { __le64 sas_address; memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); printk("---- SAS DEVICE PAGE 0 ---------\n"); printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)); printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)); printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot)); printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address)); printk("Target ID=0x%X\n", pg0->TargetID); printk("Bus=0x%X\n", pg0->Bus); /* The PhyNum field specifies the PHY number of the parent * device this device is linked to */ printk("Parent Phy Num=0x%X\n", pg0->PhyNum); printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus)); printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)); printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags)); printk("Physical Port=0x%X\n", pg0->PhysicalPort); printk("\n"); } static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1) { printk("---- SAS EXPANDER PAGE 1 ------------\n"); printk("Physical Port=0x%X\n", pg1->PhysicalPort); printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier); printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate); printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate); printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate); printk("Owner Device Handle=0x%X\n", le16_to_cpu(pg1->OwnerDevHandle)); printk("Attached Device Handle=0x%X\n", le16_to_cpu(pg1->AttachedDevHandle)); } #else #define mptsas_print_phy_data(phy_data) do { } while (0) #define mptsas_print_phy_pg0(pg0) do { } while (0) #define mptsas_print_phy_pg1(pg1) do { } while (0) #define mptsas_print_device_pg0(pg0) do { } while (0) #define mptsas_print_expander_pg1(pg1) do { } while (0) #endif /* /* * This is pretty ugly. We will be able to seriously clean it up * This is pretty ugly. We will be able to seriously clean it up * once the DV code in mptscsih goes away and we can properly * once the DV code in mptscsih goes away and we can properly Loading Loading @@ -200,91 +299,159 @@ static struct scsi_host_template mptsas_driver_template = { .use_clustering = ENABLE_CLUSTERING, .use_clustering = ENABLE_CLUSTERING, }; }; static struct sas_function_template mptsas_transport_functions = { static inline MPT_ADAPTER *phy_to_ioc(struct sas_phy *phy) }; static struct scsi_transport_template *mptsas_transport_template; #ifdef SASDEBUG static void mptsas_print_phy_data(MPI_SAS_IO_UNIT0_PHY_DATA *phy_data) { { printk("---- IO UNIT PAGE 0 ------------\n"); struct Scsi_Host *shost = dev_to_shost(phy->dev.parent); printk("Handle=0x%X\n", return ((MPT_SCSI_HOST *)shost->hostdata)->ioc; le16_to_cpu(phy_data->AttachedDeviceHandle)); printk("Controller Handle=0x%X\n", le16_to_cpu(phy_data->ControllerDevHandle)); printk("Port=0x%X\n", phy_data->Port); printk("Port Flags=0x%X\n", phy_data->PortFlags); printk("PHY Flags=0x%X\n", phy_data->PhyFlags); printk("Negotiated Link Rate=0x%X\n", phy_data->NegotiatedLinkRate); printk("Controller PHY Device Info=0x%X\n", le32_to_cpu(phy_data->ControllerPhyDeviceInfo)); printk("DiscoveryStatus=0x%X\n", le32_to_cpu(phy_data->DiscoveryStatus)); printk("\n"); } } static void mptsas_print_phy_pg0(SasPhyPage0_t *pg0) static int mptsas_get_linkerrors(struct sas_phy *phy) { { __le64 sas_address; MPT_ADAPTER *ioc = phy_to_ioc(phy); ConfigExtendedPageHeader_t hdr; CONFIGPARMS cfg; SasPhyPage1_t *buffer; dma_addr_t dma_handle; int error; memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); hdr.PageVersion = MPI_SASPHY1_PAGEVERSION; hdr.ExtPageLength = 0; hdr.PageNumber = 1 /* page number 1*/; hdr.Reserved1 = 0; hdr.Reserved2 = 0; hdr.PageType = MPI_CONFIG_PAGETYPE_EXTENDED; hdr.ExtPageType = MPI_CONFIG_EXTPAGETYPE_SAS_PHY; printk("---- SAS PHY PAGE 0 ------------\n"); cfg.cfghdr.ehdr = &hdr; printk("Attached Device Handle=0x%X\n", cfg.physAddr = -1; le16_to_cpu(pg0->AttachedDevHandle)); cfg.pageAddr = phy->identify.phy_identifier; printk("SAS Address=0x%llX\n", cfg.action = MPI_CONFIG_ACTION_PAGE_HEADER; (unsigned long long)le64_to_cpu(sas_address)); cfg.dir = 0; /* read */ printk("Attached PHY Identifier=0x%X\n", pg0->AttachedPhyIdentifier); cfg.timeout = 10; printk("Attached Device Info=0x%X\n", le32_to_cpu(pg0->AttachedDeviceInfo)); error = mpt_config(ioc, &cfg); printk("Programmed Link Rate=0x%X\n", pg0->ProgrammedLinkRate); if (error) printk("Change Count=0x%X\n", pg0->ChangeCount); return error; printk("PHY Info=0x%X\n", le32_to_cpu(pg0->PhyInfo)); if (!hdr.ExtPageLength) printk("\n"); return -ENXIO; buffer = pci_alloc_consistent(ioc->pcidev, hdr.ExtPageLength * 4, &dma_handle); if (!buffer) return -ENOMEM; cfg.physAddr = dma_handle; cfg.action = MPI_CONFIG_ACTION_PAGE_READ_CURRENT; error = mpt_config(ioc, &cfg); if (error) goto out_free_consistent; mptsas_print_phy_pg1(buffer); phy->invalid_dword_count = le32_to_cpu(buffer->InvalidDwordCount); phy->running_disparity_error_count = le32_to_cpu(buffer->RunningDisparityErrorCount); phy->loss_of_dword_sync_count = le32_to_cpu(buffer->LossDwordSynchCount); phy->phy_reset_problem_count = le32_to_cpu(buffer->PhyResetProblemCount); out_free_consistent: pci_free_consistent(ioc->pcidev, hdr.ExtPageLength * 4, buffer, dma_handle); return error; } } static void mptsas_print_device_pg0(SasDevicePage0_t *pg0) static int mptsas_mgmt_done(MPT_ADAPTER *ioc, MPT_FRAME_HDR *req, MPT_FRAME_HDR *reply) { { __le64 sas_address; ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_COMMAND_GOOD; if (reply != NULL) { ioc->sas_mgmt.status |= MPT_SAS_MGMT_STATUS_RF_VALID; memcpy(ioc->sas_mgmt.reply, reply, min(ioc->reply_sz, 4 * reply->u.reply.MsgLength)); } complete(&ioc->sas_mgmt.done); return 1; } memcpy(&sas_address, &pg0->SASAddress, sizeof(__le64)); static int mptsas_phy_reset(struct sas_phy *phy, int hard_reset) { MPT_ADAPTER *ioc = phy_to_ioc(phy); SasIoUnitControlRequest_t *req; SasIoUnitControlReply_t *reply; MPT_FRAME_HDR *mf; MPIHeader_t *hdr; unsigned long timeleft; int error = -ERESTARTSYS; /* not implemented for expanders */ if (phy->identify.target_port_protocols & SAS_PROTOCOL_SMP) return -ENXIO; if (down_interruptible(&ioc->sas_mgmt.mutex)) goto out; printk("---- SAS DEVICE PAGE 0 ---------\n"); mf = mpt_get_msg_frame(mptsasMgmtCtx, ioc); printk("Handle=0x%X\n" ,le16_to_cpu(pg0->DevHandle)); if (!mf) { printk("Enclosure Handle=0x%X\n", le16_to_cpu(pg0->EnclosureHandle)); error = -ENOMEM; printk("Slot=0x%X\n", le16_to_cpu(pg0->Slot)); goto out_unlock; printk("SAS Address=0x%llX\n", le64_to_cpu(sas_address)); printk("Target ID=0x%X\n", pg0->TargetID); printk("Bus=0x%X\n", pg0->Bus); printk("Parent Phy Num=0x%X\n", pg0->PhyNum); printk("Access Status=0x%X\n", le16_to_cpu(pg0->AccessStatus)); printk("Device Info=0x%X\n", le32_to_cpu(pg0->DeviceInfo)); printk("Flags=0x%X\n", le16_to_cpu(pg0->Flags)); printk("Physical Port=0x%X\n", pg0->PhysicalPort); printk("\n"); } } static void mptsas_print_expander_pg1(SasExpanderPage1_t *pg1) hdr = (MPIHeader_t *) mf; { req = (SasIoUnitControlRequest_t *)mf; printk("---- SAS EXPANDER PAGE 1 ------------\n"); memset(req, 0, sizeof(SasIoUnitControlRequest_t)); req->Function = MPI_FUNCTION_SAS_IO_UNIT_CONTROL; req->MsgContext = hdr->MsgContext; req->Operation = hard_reset ? MPI_SAS_OP_PHY_HARD_RESET : MPI_SAS_OP_PHY_LINK_RESET; req->PhyNum = phy->identify.phy_identifier; printk("Physical Port=0x%X\n", pg1->PhysicalPort); mpt_put_msg_frame(mptsasMgmtCtx, ioc, mf); printk("PHY Identifier=0x%X\n", pg1->PhyIdentifier); printk("Negotiated Link Rate=0x%X\n", pg1->NegotiatedLinkRate); timeleft = wait_for_completion_timeout(&ioc->sas_mgmt.done, printk("Programmed Link Rate=0x%X\n", pg1->ProgrammedLinkRate); 10 * HZ); printk("Hardware Link Rate=0x%X\n", pg1->HwLinkRate); if (!timeleft) { printk("Owner Device Handle=0x%X\n", /* On timeout reset the board */ le16_to_cpu(pg1->OwnerDevHandle)); mpt_free_msg_frame(ioc, mf); printk("Attached Device Handle=0x%X\n", mpt_HardResetHandler(ioc, CAN_SLEEP); le16_to_cpu(pg1->AttachedDevHandle)); error = -ETIMEDOUT; goto out_unlock; } } #else #define mptsas_print_phy_data(phy_data) do { } while (0) /* a reply frame is expected */ #define mptsas_print_phy_pg0(pg0) do { } while (0) if ((ioc->sas_mgmt.status & #define mptsas_print_device_pg0(pg0) do { } while (0) MPT_IOCTL_STATUS_RF_VALID) == 0) { #define mptsas_print_expander_pg1(pg1) do { } while (0) error = -ENXIO; #endif goto out_unlock; } /* process the completed Reply Message Frame */ reply = (SasIoUnitControlReply_t *)ioc->sas_mgmt.reply; if (reply->IOCStatus != MPI_IOCSTATUS_SUCCESS) { printk("%s: IOCStatus=0x%X IOCLogInfo=0x%X\n", __FUNCTION__, reply->IOCStatus, reply->IOCLogInfo); error = -ENXIO; goto out_unlock; } error = 0; out_unlock: up(&ioc->sas_mgmt.mutex); out: return error; } static struct sas_function_template mptsas_transport_functions = { .get_linkerrors = mptsas_get_linkerrors, .phy_reset = mptsas_phy_reset, }; static struct scsi_transport_template *mptsas_transport_template; static int static int mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) mptsas_sas_io_unit_pg0(MPT_ADAPTER *ioc, struct mptsas_portinfo *port_info) Loading Loading @@ -680,7 +847,7 @@ mptsas_parse_device_info(struct sas_identify *identify, } } static int mptsas_probe_one_phy(struct device *dev, static int mptsas_probe_one_phy(struct device *dev, struct mptsas_phyinfo *phy_info, int index) struct mptsas_phyinfo *phy_info, int index, int local) { { struct sas_phy *port; struct sas_phy *port; int error; int error; Loading Loading @@ -773,6 +940,9 @@ static int mptsas_probe_one_phy(struct device *dev, break; break; } } if (local) port->local_attached = 1; error = sas_phy_add(port); error = sas_phy_add(port); if (error) { if (error) { sas_phy_free(port); sas_phy_free(port); Loading Loading @@ -838,7 +1008,7 @@ mptsas_probe_hba_phys(MPT_ADAPTER *ioc, int *index) } } mptsas_probe_one_phy(&ioc->sh->shost_gendev, mptsas_probe_one_phy(&ioc->sh->shost_gendev, &port_info->phy_info[i], *index); &port_info->phy_info[i], *index, 1); (*index)++; (*index)++; } } Loading Loading @@ -909,7 +1079,8 @@ mptsas_probe_expander_phys(MPT_ADAPTER *ioc, u32 *handle, int *index) } } } } mptsas_probe_one_phy(parent, &port_info->phy_info[i], *index); mptsas_probe_one_phy(parent, &port_info->phy_info[i], *index, 0); (*index)++; (*index)++; } } Loading Loading @@ -1021,6 +1192,8 @@ mptsas_probe(struct pci_dev *pdev, const struct pci_device_id *id) sh->unique_id = ioc->id; sh->unique_id = ioc->id; INIT_LIST_HEAD(&ioc->sas_topology); INIT_LIST_HEAD(&ioc->sas_topology); init_MUTEX(&ioc->sas_mgmt.mutex); init_completion(&ioc->sas_mgmt.done); /* Verify that we won't exceed the maximum /* Verify that we won't exceed the maximum * number of chain buffers * number of chain buffers Loading Loading @@ -1207,6 +1380,7 @@ mptsas_init(void) mptsasTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSAS_DRIVER); mptsasTaskCtx = mpt_register(mptscsih_taskmgmt_complete, MPTSAS_DRIVER); mptsasInternalCtx = mptsasInternalCtx = mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER); mpt_register(mptscsih_scandv_complete, MPTSAS_DRIVER); mptsasMgmtCtx = mpt_register(mptsas_mgmt_done, MPTSAS_DRIVER); if (mpt_event_register(mptsasDoneCtx, mptscsih_event_process) == 0) { if (mpt_event_register(mptsasDoneCtx, mptscsih_event_process) == 0) { devtprintk((KERN_INFO MYNAM devtprintk((KERN_INFO MYNAM Loading @@ -1230,6 +1404,7 @@ mptsas_exit(void) mpt_reset_deregister(mptsasDoneCtx); mpt_reset_deregister(mptsasDoneCtx); mpt_event_deregister(mptsasDoneCtx); mpt_event_deregister(mptsasDoneCtx); mpt_deregister(mptsasMgmtCtx); mpt_deregister(mptsasInternalCtx); mpt_deregister(mptsasInternalCtx); mpt_deregister(mptsasTaskCtx); mpt_deregister(mptsasTaskCtx); mpt_deregister(mptsasDoneCtx); mpt_deregister(mptsasDoneCtx); Loading
drivers/scsi/3w-9xxx.c +3 −1 Original line number Original line Diff line number Diff line Loading @@ -1732,7 +1732,9 @@ static int twa_scsi_eh_reset(struct scsi_cmnd *SCpnt) tw_dev->num_resets++; tw_dev->num_resets++; printk(KERN_WARNING "3w-9xxx: scsi%d: WARNING: (0x%02X:0x%04X): Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, TW_DRIVER, 0x2c, SCpnt->device->id, SCpnt->cmnd[0]); sdev_printk(KERN_WARNING, SCpnt->device, "WARNING: (0x%02X:0x%04X): Command (0x%x) timed out, resetting card.\n", TW_DRIVER, 0x2c, SCpnt->cmnd[0]); /* Now reset the card and some of the device extension data */ /* Now reset the card and some of the device extension data */ if (twa_reset_device_extension(tw_dev, 0)) { if (twa_reset_device_extension(tw_dev, 0)) { Loading
drivers/scsi/3w-xxxx.c +3 −1 Original line number Original line Diff line number Diff line Loading @@ -1432,7 +1432,9 @@ static int tw_scsi_eh_reset(struct scsi_cmnd *SCpnt) tw_dev->num_resets++; tw_dev->num_resets++; printk(KERN_WARNING "3w-xxxx: scsi%d: WARNING: Unit #%d: Command (0x%x) timed out, resetting card.\n", tw_dev->host->host_no, SCpnt->device->id, SCpnt->cmnd[0]); sdev_printk(KERN_WARNING, SCpnt->device, "WARNING: Command (0x%x) timed out, resetting card.\n", SCpnt->cmnd[0]); /* Now reset the card and some of the device extension data */ /* Now reset the card and some of the device extension data */ if (tw_reset_device_extension(tw_dev, 0)) { if (tw_reset_device_extension(tw_dev, 0)) { Loading