Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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] libsas: fix runaway error handler problem
[SCSI] fix incorrect value of SCSI_MAX_SG_CHAIN_SEGMENTS due to include file ordering
[SCSI] arcmsr: Fix the issue of system hangup after commands timeout on ARC-1200
[SCSI] mpt2sas: fix Integrated Raid unsynced on shutdown problem
[SCSI] mpt2sas: Kernel Panic during Large Topology discovery
[SCSI] mpt2sas: Fix the race between broadcast asyn event and scsi command completion
[SCSI] mpt2sas: Correct resizing calculation for max_queue_depth
[SCSI] mpt2sas: fix internal device reset for older firmware prior to MPI Rev K
[SCSI] mpt2sas: Fix device removal handshake for zoned devices

+117 -95
+7 -4
drivers/scsi/arcmsr/arcmsr.h
··· 2 2 ******************************************************************************* 3 3 ** O.S : Linux 4 4 ** FILE NAME : arcmsr.h 5 - ** BY : Erich Chen 5 + ** BY : Nick Cheng 6 6 ** Description: SCSI RAID Device Driver for 7 7 ** ARECA RAID Host adapter 8 8 ******************************************************************************* ··· 46 46 struct device_attribute; 47 47 /*The limit of outstanding scsi command that firmware can handle*/ 48 48 #define ARCMSR_MAX_OUTSTANDING_CMD 256 49 - #define ARCMSR_MAX_FREECCB_NUM 320 50 - #define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.15 2010/02/02" 49 + #ifdef CONFIG_XEN 50 + #define ARCMSR_MAX_FREECCB_NUM 160 51 + #else 52 + #define ARCMSR_MAX_FREECCB_NUM 320 53 + #endif 54 + #define ARCMSR_DRIVER_VERSION "Driver Version 1.20.00.15 2010/08/05" 51 55 #define ARCMSR_SCSI_INITIATOR_ID 255 52 56 #define ARCMSR_MAX_XFER_SECTORS 512 53 57 #define ARCMSR_MAX_XFER_SECTORS_B 4096 ··· 64 60 #define ARCMSR_MAX_HBB_POSTQUEUE 264 65 61 #define ARCMSR_MAX_XFER_LEN 0x26000 /* 152K */ 66 62 #define ARCMSR_CDB_SG_PAGE_LENGTH 256 67 - #define SCSI_CMD_ARECA_SPECIFIC 0xE1 68 63 #ifndef PCI_DEVICE_ID_ARECA_1880 69 64 #define PCI_DEVICE_ID_ARECA_1880 0x1880 70 65 #endif
+1 -1
drivers/scsi/arcmsr/arcmsr_attr.c
··· 2 2 ******************************************************************************* 3 3 ** O.S : Linux 4 4 ** FILE NAME : arcmsr_attr.c 5 - ** BY : Erich Chen 5 + ** BY : Nick Cheng 6 6 ** Description: attributes exported to sysfs and device host 7 7 ******************************************************************************* 8 8 ** Copyright (C) 2002 - 2005, Areca Technology Corporation All rights reserved
+41 -73
drivers/scsi/arcmsr/arcmsr_hba.c
··· 2 2 ******************************************************************************* 3 3 ** O.S : Linux 4 4 ** FILE NAME : arcmsr_hba.c 5 - ** BY : Erich Chen 5 + ** BY : Nick Cheng 6 6 ** Description: SCSI RAID Device Driver for 7 7 ** ARECA RAID Host adapter 8 8 ******************************************************************************* ··· 76 76 MODULE_LICENSE("Dual BSD/GPL"); 77 77 MODULE_VERSION(ARCMSR_DRIVER_VERSION); 78 78 static int sleeptime = 10; 79 - static int retrycount = 30; 79 + static int retrycount = 12; 80 80 wait_queue_head_t wait_q; 81 81 static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, 82 82 struct scsi_cmnd *cmd); ··· 187 187 if (isleep > 0) { 188 188 msleep(isleep*1000); 189 189 } 190 - printk(KERN_NOTICE "wake-up\n"); 191 190 return 0; 192 191 } 193 192 ··· 920 921 } 921 922 922 923 static void arcmsr_drain_donequeue(struct AdapterControlBlock *acb, struct CommandControlBlock *pCCB, bool error) 923 - 924 924 { 925 925 int id, lun; 926 926 if ((pCCB->acb != acb) || (pCCB->startdone != ARCMSR_CCB_START)) { ··· 946 948 , pCCB->startdone 947 949 , atomic_read(&acb->ccboutstandingcount)); 948 950 return; 949 - } 951 + } 950 952 arcmsr_report_ccb_state(acb, pCCB, error); 951 953 } 952 954 ··· 979 981 case ACB_ADAPTER_TYPE_B: { 980 982 struct MessageUnit_B *reg = acb->pmuB; 981 983 /*clear all outbound posted Q*/ 982 - writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, &reg->iop2drv_doorbell); /* clear doorbell interrupt */ 984 + writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, reg->iop2drv_doorbell); /* clear doorbell interrupt */ 983 985 for (i = 0; i < ARCMSR_MAX_HBB_POSTQUEUE; i++) { 984 986 if ((flag_ccb = readl(&reg->done_qbuffer[i])) != 0) { 985 987 writel(0, &reg->done_qbuffer[i]); ··· 1509 1511 arcmsr_drain_donequeue(acb, pCCB, error); 1510 1512 } 1511 1513 } 1512 - 1513 1514 static void arcmsr_hbb_postqueue_isr(struct AdapterControlBlock *acb) 1514 1515 { 1515 1516 uint32_t index; ··· 2103 2106 if (atomic_read(&acb->ccboutstandingcount) >= 2104 2107 ARCMSR_MAX_OUTSTANDING_CMD) 2105 2108 return SCSI_MLQUEUE_HOST_BUSY; 2106 - if ((scsicmd == SCSI_CMD_ARECA_SPECIFIC)) { 2107 - printk(KERN_NOTICE "Receiveing SCSI_CMD_ARECA_SPECIFIC command..\n"); 2108 - return 0; 2109 - } 2110 2109 ccb = arcmsr_get_freeccb(acb); 2111 2110 if (!ccb) 2112 2111 return SCSI_MLQUEUE_HOST_BUSY; ··· 2386 2393 int index, rtn; 2387 2394 bool error; 2388 2395 polling_hbb_ccb_retry: 2396 + 2389 2397 poll_count++; 2390 2398 /* clear doorbell interrupt */ 2391 2399 writel(ARCMSR_DOORBELL_INT_CLEAR_PATTERN, reg->iop2drv_doorbell); ··· 2657 2663 { 2658 2664 struct MessageUnit_A __iomem *reg = acb->pmuA; 2659 2665 if (unlikely(atomic_read(&acb->rq_map_token) == 0) || ((acb->acb_flags & ACB_F_BUS_RESET) != 0 ) || ((acb->acb_flags & ACB_F_ABORT) != 0 )){ 2666 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 2660 2667 return; 2661 2668 } else { 2662 2669 acb->fw_flag = FW_NORMAL; ··· 2665 2670 atomic_set(&acb->rq_map_token, 16); 2666 2671 } 2667 2672 atomic_set(&acb->ante_token_value, atomic_read(&acb->rq_map_token)); 2668 - if (atomic_dec_and_test(&acb->rq_map_token)) 2673 + if (atomic_dec_and_test(&acb->rq_map_token)) { 2674 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 2669 2675 return; 2676 + } 2670 2677 writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0); 2671 2678 mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 2672 2679 } ··· 2679 2682 { 2680 2683 struct MessageUnit_B __iomem *reg = acb->pmuB; 2681 2684 if (unlikely(atomic_read(&acb->rq_map_token) == 0) || ((acb->acb_flags & ACB_F_BUS_RESET) != 0 ) || ((acb->acb_flags & ACB_F_ABORT) != 0 )){ 2685 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 2682 2686 return; 2683 2687 } else { 2684 2688 acb->fw_flag = FW_NORMAL; 2685 2689 if (atomic_read(&acb->ante_token_value) == atomic_read(&acb->rq_map_token)) { 2686 - atomic_set(&acb->rq_map_token,16); 2690 + atomic_set(&acb->rq_map_token, 16); 2687 2691 } 2688 2692 atomic_set(&acb->ante_token_value, atomic_read(&acb->rq_map_token)); 2689 - if(atomic_dec_and_test(&acb->rq_map_token)) 2693 + if (atomic_dec_and_test(&acb->rq_map_token)) { 2694 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 2690 2695 return; 2696 + } 2691 2697 writel(ARCMSR_MESSAGE_GET_CONFIG, reg->drv2iop_doorbell); 2692 2698 mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 2693 2699 } ··· 2701 2701 { 2702 2702 struct MessageUnit_C __iomem *reg = acb->pmuC; 2703 2703 if (unlikely(atomic_read(&acb->rq_map_token) == 0) || ((acb->acb_flags & ACB_F_BUS_RESET) != 0) || ((acb->acb_flags & ACB_F_ABORT) != 0)) { 2704 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 2704 2705 return; 2705 2706 } else { 2706 2707 acb->fw_flag = FW_NORMAL; ··· 2709 2708 atomic_set(&acb->rq_map_token, 16); 2710 2709 } 2711 2710 atomic_set(&acb->ante_token_value, atomic_read(&acb->rq_map_token)); 2712 - if (atomic_dec_and_test(&acb->rq_map_token)) 2711 + if (atomic_dec_and_test(&acb->rq_map_token)) { 2712 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 2713 2713 return; 2714 + } 2714 2715 writel(ARCMSR_INBOUND_MESG0_GET_CONFIG, &reg->inbound_msgaddr0); 2715 2716 writel(ARCMSR_HBCMU_DRV2IOP_MESSAGE_CMD_DONE, &reg->inbound_doorbell); 2716 2717 mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); ··· 2900 2897 uint32_t intmask_org; 2901 2898 uint8_t rtnval = 0x00; 2902 2899 int i = 0; 2900 + unsigned long flags; 2901 + 2903 2902 if (atomic_read(&acb->ccboutstandingcount) != 0) { 2904 2903 /* disable all outbound interrupt */ 2905 2904 intmask_org = arcmsr_disable_outbound_ints(acb); ··· 2912 2907 for (i = 0; i < ARCMSR_MAX_FREECCB_NUM; i++) { 2913 2908 ccb = acb->pccb_pool[i]; 2914 2909 if (ccb->startdone == ARCMSR_CCB_START) { 2915 - arcmsr_ccb_complete(ccb); 2910 + scsi_dma_unmap(ccb->pcmd); 2911 + ccb->startdone = ARCMSR_CCB_DONE; 2912 + ccb->ccb_flags = 0; 2913 + spin_lock_irqsave(&acb->ccblist_lock, flags); 2914 + list_add_tail(&ccb->list, &acb->ccb_free_list); 2915 + spin_unlock_irqrestore(&acb->ccblist_lock, flags); 2916 2916 } 2917 2917 } 2918 2918 atomic_set(&acb->ccboutstandingcount, 0); ··· 2930 2920 2931 2921 static int arcmsr_bus_reset(struct scsi_cmnd *cmd) 2932 2922 { 2933 - struct AdapterControlBlock *acb = 2934 - (struct AdapterControlBlock *)cmd->device->host->hostdata; 2923 + struct AdapterControlBlock *acb; 2935 2924 uint32_t intmask_org, outbound_doorbell; 2936 2925 int retry_count = 0; 2937 2926 int rtn = FAILED; ··· 2980 2971 atomic_set(&acb->rq_map_token, 16); 2981 2972 atomic_set(&acb->ante_token_value, 16); 2982 2973 acb->fw_flag = FW_NORMAL; 2983 - init_timer(&acb->eternal_timer); 2984 - acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6*HZ); 2985 - acb->eternal_timer.data = (unsigned long) acb; 2986 - acb->eternal_timer.function = &arcmsr_request_device_map; 2987 - add_timer(&acb->eternal_timer); 2974 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 2988 2975 acb->acb_flags &= ~ACB_F_BUS_RESET; 2989 2976 rtn = SUCCESS; 2990 2977 printk(KERN_ERR "arcmsr: scsi bus reset eh returns with success\n"); 2991 2978 } else { 2992 2979 acb->acb_flags &= ~ACB_F_BUS_RESET; 2993 - if (atomic_read(&acb->rq_map_token) == 0) { 2994 - atomic_set(&acb->rq_map_token, 16); 2995 - atomic_set(&acb->ante_token_value, 16); 2996 - acb->fw_flag = FW_NORMAL; 2997 - init_timer(&acb->eternal_timer); 2998 - acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6*HZ); 2999 - acb->eternal_timer.data = (unsigned long) acb; 3000 - acb->eternal_timer.function = &arcmsr_request_device_map; 3001 - add_timer(&acb->eternal_timer); 3002 - } else { 3003 - atomic_set(&acb->rq_map_token, 16); 3004 - atomic_set(&acb->ante_token_value, 16); 3005 - acb->fw_flag = FW_NORMAL; 3006 - mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6*HZ)); 3007 - } 2980 + atomic_set(&acb->rq_map_token, 16); 2981 + atomic_set(&acb->ante_token_value, 16); 2982 + acb->fw_flag = FW_NORMAL; 2983 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6*HZ)); 3008 2984 rtn = SUCCESS; 3009 2985 } 3010 2986 break; ··· 3001 3007 rtn = FAILED; 3002 3008 } else { 3003 3009 acb->acb_flags &= ~ACB_F_BUS_RESET; 3004 - if (atomic_read(&acb->rq_map_token) == 0) { 3005 - atomic_set(&acb->rq_map_token, 16); 3006 - atomic_set(&acb->ante_token_value, 16); 3007 - acb->fw_flag = FW_NORMAL; 3008 - init_timer(&acb->eternal_timer); 3009 - acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6*HZ); 3010 - acb->eternal_timer.data = (unsigned long) acb; 3011 - acb->eternal_timer.function = &arcmsr_request_device_map; 3012 - add_timer(&acb->eternal_timer); 3013 - } else { 3014 - atomic_set(&acb->rq_map_token, 16); 3015 - atomic_set(&acb->ante_token_value, 16); 3016 - acb->fw_flag = FW_NORMAL; 3017 - mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6*HZ)); 3018 - } 3010 + atomic_set(&acb->rq_map_token, 16); 3011 + atomic_set(&acb->ante_token_value, 16); 3012 + acb->fw_flag = FW_NORMAL; 3013 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 3019 3014 rtn = SUCCESS; 3020 3015 } 3021 3016 break; ··· 3050 3067 atomic_set(&acb->rq_map_token, 16); 3051 3068 atomic_set(&acb->ante_token_value, 16); 3052 3069 acb->fw_flag = FW_NORMAL; 3053 - init_timer(&acb->eternal_timer); 3054 - acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6 * HZ); 3055 - acb->eternal_timer.data = (unsigned long) acb; 3056 - acb->eternal_timer.function = &arcmsr_request_device_map; 3057 - add_timer(&acb->eternal_timer); 3070 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6 * HZ)); 3058 3071 acb->acb_flags &= ~ACB_F_BUS_RESET; 3059 3072 rtn = SUCCESS; 3060 3073 printk(KERN_ERR "arcmsr: scsi bus reset eh returns with success\n"); 3061 3074 } else { 3062 3075 acb->acb_flags &= ~ACB_F_BUS_RESET; 3063 - if (atomic_read(&acb->rq_map_token) == 0) { 3064 - atomic_set(&acb->rq_map_token, 16); 3065 - atomic_set(&acb->ante_token_value, 16); 3066 - acb->fw_flag = FW_NORMAL; 3067 - init_timer(&acb->eternal_timer); 3068 - acb->eternal_timer.expires = jiffies + msecs_to_jiffies(6*HZ); 3069 - acb->eternal_timer.data = (unsigned long) acb; 3070 - acb->eternal_timer.function = &arcmsr_request_device_map; 3071 - add_timer(&acb->eternal_timer); 3072 - } else { 3073 - atomic_set(&acb->rq_map_token, 16); 3074 - atomic_set(&acb->ante_token_value, 16); 3075 - acb->fw_flag = FW_NORMAL; 3076 - mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6*HZ)); 3077 - } 3076 + atomic_set(&acb->rq_map_token, 16); 3077 + atomic_set(&acb->ante_token_value, 16); 3078 + acb->fw_flag = FW_NORMAL; 3079 + mod_timer(&acb->eternal_timer, jiffies + msecs_to_jiffies(6*HZ)); 3078 3080 rtn = SUCCESS; 3079 3081 } 3080 3082 break;
+1
drivers/scsi/libsas/sas_scsi_host.c
··· 646 646 647 647 spin_lock_irqsave(shost->host_lock, flags); 648 648 list_splice_init(&shost->eh_cmd_q, &eh_work_q); 649 + shost->host_eh_scheduled = 0; 649 650 spin_unlock_irqrestore(shost->host_lock, flags); 650 651 651 652 SAS_DPRINTK("Enter %s\n", __func__);
+14 -5
drivers/scsi/mpt2sas/mpt2sas_base.c
··· 2176 2176 /* adjust hba_queue_depth, reply_free_queue_depth, 2177 2177 * and queue_size 2178 2178 */ 2179 - ioc->hba_queue_depth -= queue_diff; 2180 - ioc->reply_free_queue_depth -= queue_diff; 2181 - queue_size -= queue_diff; 2179 + ioc->hba_queue_depth -= (queue_diff / 2); 2180 + ioc->reply_free_queue_depth -= (queue_diff / 2); 2181 + queue_size = facts->MaxReplyDescriptorPostQueueDepth; 2182 2182 } 2183 2183 ioc->reply_post_queue_depth = queue_size; 2184 2184 ··· 3941 3941 static void 3942 3942 _base_reset_handler(struct MPT2SAS_ADAPTER *ioc, int reset_phase) 3943 3943 { 3944 + mpt2sas_scsih_reset_handler(ioc, reset_phase); 3945 + mpt2sas_ctl_reset_handler(ioc, reset_phase); 3944 3946 switch (reset_phase) { 3945 3947 case MPT2_IOC_PRE_RESET: 3946 3948 dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: " ··· 3973 3971 "MPT2_IOC_DONE_RESET\n", ioc->name, __func__)); 3974 3972 break; 3975 3973 } 3976 - mpt2sas_scsih_reset_handler(ioc, reset_phase); 3977 - mpt2sas_ctl_reset_handler(ioc, reset_phase); 3978 3974 } 3979 3975 3980 3976 /** ··· 4026 4026 { 4027 4027 int r; 4028 4028 unsigned long flags; 4029 + u8 pe_complete = ioc->wait_for_port_enable_to_complete; 4029 4030 4030 4031 dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name, 4031 4032 __func__)); ··· 4069 4068 if (r) 4070 4069 goto out; 4071 4070 _base_reset_handler(ioc, MPT2_IOC_AFTER_RESET); 4071 + 4072 + /* If this hard reset is called while port enable is active, then 4073 + * there is no reason to call make_ioc_operational 4074 + */ 4075 + if (pe_complete) { 4076 + r = -EFAULT; 4077 + goto out; 4078 + } 4072 4079 r = _base_make_ioc_operational(ioc, sleep_flag); 4073 4080 if (!r) 4074 4081 _base_reset_handler(ioc, MPT2_IOC_DONE_RESET);
+52 -12
drivers/scsi/mpt2sas/mpt2sas_scsih.c
··· 819 819 } 820 820 821 821 /** 822 - * mptscsih_get_scsi_lookup - returns scmd entry 822 + * _scsih_scsi_lookup_get - returns scmd entry 823 823 * @ioc: per adapter object 824 824 * @smid: system request message index 825 825 * ··· 829 829 _scsih_scsi_lookup_get(struct MPT2SAS_ADAPTER *ioc, u16 smid) 830 830 { 831 831 return ioc->scsi_lookup[smid - 1].scmd; 832 + } 833 + 834 + /** 835 + * _scsih_scsi_lookup_get_clear - returns scmd entry 836 + * @ioc: per adapter object 837 + * @smid: system request message index 838 + * 839 + * Returns the smid stored scmd pointer. 840 + * Then will derefrence the stored scmd pointer. 841 + */ 842 + static inline struct scsi_cmnd * 843 + _scsih_scsi_lookup_get_clear(struct MPT2SAS_ADAPTER *ioc, u16 smid) 844 + { 845 + unsigned long flags; 846 + struct scsi_cmnd *scmd; 847 + 848 + spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); 849 + scmd = ioc->scsi_lookup[smid - 1].scmd; 850 + ioc->scsi_lookup[smid - 1].scmd = NULL; 851 + spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); 852 + 853 + return scmd; 832 854 } 833 855 834 856 /** ··· 3003 2981 u16 handle; 3004 2982 3005 2983 for (i = 0 ; i < event_data->NumEntries; i++) { 3006 - if (event_data->PHY[i].PhyStatus & 3007 - MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT) 3008 - continue; 3009 2984 handle = le16_to_cpu(event_data->PHY[i].AttachedDevHandle); 3010 2985 if (!handle) 3011 2986 continue; ··· 3229 3210 u16 count = 0; 3230 3211 3231 3212 for (smid = 1; smid <= ioc->scsiio_depth; smid++) { 3232 - scmd = _scsih_scsi_lookup_get(ioc, smid); 3213 + scmd = _scsih_scsi_lookup_get_clear(ioc, smid); 3233 3214 if (!scmd) 3234 3215 continue; 3235 3216 count++; ··· 3823 3804 u32 response_code = 0; 3824 3805 3825 3806 mpi_reply = mpt2sas_base_get_reply_virt_addr(ioc, reply); 3826 - scmd = _scsih_scsi_lookup_get(ioc, smid); 3807 + scmd = _scsih_scsi_lookup_get_clear(ioc, smid); 3827 3808 if (scmd == NULL) 3828 3809 return 1; 3829 3810 ··· 5024 5005 event_data); 5025 5006 #endif 5026 5007 5008 + /* In MPI Revision K (0xC), the internal device reset complete was 5009 + * implemented, so avoid setting tm_busy flag for older firmware. 5010 + */ 5011 + if ((ioc->facts.HeaderVersion >> 8) < 0xC) 5012 + return; 5013 + 5027 5014 if (event_data->ReasonCode != 5028 5015 MPI2_EVENT_SAS_DEV_STAT_RC_INTERNAL_DEVICE_RESET && 5029 5016 event_data->ReasonCode != ··· 5124 5099 struct fw_event_work *fw_event) 5125 5100 { 5126 5101 struct scsi_cmnd *scmd; 5102 + struct scsi_device *sdev; 5127 5103 u16 smid, handle; 5128 5104 u32 lun; 5129 5105 struct MPT2SAS_DEVICE *sas_device_priv_data; ··· 5135 5109 Mpi2EventDataSasBroadcastPrimitive_t *event_data = fw_event->event_data; 5136 5110 #endif 5137 5111 u16 ioc_status; 5112 + unsigned long flags; 5113 + int r; 5114 + 5138 5115 dewtprintk(ioc, printk(MPT2SAS_INFO_FMT "broadcast primative: " 5139 5116 "phy number(%d), width(%d)\n", ioc->name, event_data->PhyNum, 5140 5117 event_data->PortWidth)); 5141 5118 dtmprintk(ioc, printk(MPT2SAS_INFO_FMT "%s: enter\n", ioc->name, 5142 5119 __func__)); 5143 5120 5121 + spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); 5122 + ioc->broadcast_aen_busy = 0; 5144 5123 termination_count = 0; 5145 5124 query_count = 0; 5146 5125 mpi_reply = ioc->tm_cmds.reply; ··· 5153 5122 scmd = _scsih_scsi_lookup_get(ioc, smid); 5154 5123 if (!scmd) 5155 5124 continue; 5156 - sas_device_priv_data = scmd->device->hostdata; 5125 + sdev = scmd->device; 5126 + sas_device_priv_data = sdev->hostdata; 5157 5127 if (!sas_device_priv_data || !sas_device_priv_data->sas_target) 5158 5128 continue; 5159 5129 /* skip hidden raid components */ ··· 5170 5138 lun = sas_device_priv_data->lun; 5171 5139 query_count++; 5172 5140 5141 + spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); 5173 5142 mpt2sas_scsih_issue_tm(ioc, handle, 0, 0, lun, 5174 5143 MPI2_SCSITASKMGMT_TASKTYPE_QUERY_TASK, smid, 30, NULL); 5175 5144 ioc->tm_cmds.status = MPT2_CMD_NOT_USED; ··· 5180 5147 (mpi_reply->ResponseCode == 5181 5148 MPI2_SCSITASKMGMT_RSP_TM_SUCCEEDED || 5182 5149 mpi_reply->ResponseCode == 5183 - MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC)) 5150 + MPI2_SCSITASKMGMT_RSP_IO_QUEUED_ON_IOC)) { 5151 + spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); 5184 5152 continue; 5185 - 5186 - mpt2sas_scsih_issue_tm(ioc, handle, 0, 0, lun, 5187 - MPI2_SCSITASKMGMT_TASKTYPE_ABRT_TASK_SET, 0, 30, NULL); 5153 + } 5154 + r = mpt2sas_scsih_issue_tm(ioc, handle, sdev->channel, sdev->id, 5155 + sdev->lun, MPI2_SCSITASKMGMT_TASKTYPE_ABORT_TASK, smid, 30, 5156 + scmd); 5157 + if (r == FAILED) 5158 + sdev_printk(KERN_WARNING, sdev, "task abort: FAILED " 5159 + "scmd(%p)\n", scmd); 5188 5160 termination_count += le32_to_cpu(mpi_reply->TerminationCount); 5161 + spin_lock_irqsave(&ioc->scsi_lookup_lock, flags); 5189 5162 } 5190 - ioc->broadcast_aen_busy = 0; 5163 + spin_unlock_irqrestore(&ioc->scsi_lookup_lock, flags); 5191 5164 5192 5165 dtmprintk(ioc, printk(MPT2SAS_INFO_FMT 5193 5166 "%s - exit, query_count = %d termination_count = %d\n", ··· 6665 6626 destroy_workqueue(wq); 6666 6627 6667 6628 /* release all the volumes */ 6629 + _scsih_ir_shutdown(ioc); 6668 6630 list_for_each_entry_safe(raid_device, next, &ioc->raid_device_list, 6669 6631 list) { 6670 6632 if (raid_device->starget) {
+1
include/scsi/scsi.h
··· 9 9 #define _SCSI_SCSI_H 10 10 11 11 #include <linux/types.h> 12 + #include <linux/scatterlist.h> 12 13 13 14 struct scsi_cmnd; 14 15