diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-14 20:49:48 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2014-06-14 20:49:48 -0400 |
commit | abf04af74a9f27a65172a43b43ccabcbc2bbdc39 (patch) | |
tree | a9336a3797f8f6c445b1439278f558310ceae56a /drivers | |
parent | 16d52ef7c026f925893a1c0fc46516349928f319 (diff) | |
parent | c7ee3bd4870ef1d96a1202f92ce858f849670a62 (diff) |
Merge tag 'scsi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull more SCSI updates from James Bottomley:
"This is just a couple of drivers (hpsa and lpfc) that got left out for
further testing in linux-next. We also have one fix to a prior
submission (qla2xxx sparse)"
* tag 'scsi-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: (36 commits)
qla2xxx: fix sparse warnings introduced by previous target mode t10-dif patch
lpfc: Update lpfc version to driver version 10.2.8001.0
lpfc: Fix ExpressLane priority setup
lpfc: mark old devices as obsolete
lpfc: Fix for initializing RRQ bitmap
lpfc: Fix for cleaning up stale ring flag and sp_queue_event entries
lpfc: Update lpfc version to driver version 10.2.8000.0
lpfc: Update Copyright on changed files from 8.3.45 patches
lpfc: Update Copyright on changed files
lpfc: Fixed locking for scsi task management commands
lpfc: Convert runtime references to old xlane cfg param to fof cfg param
lpfc: Fix FW dump using sysfs
lpfc: Fix SLI4 s abort loop to process all FCP rings and under ring_lock
lpfc: Fixed kernel panic in lpfc_abort_handler
lpfc: Fix locking for postbufq when freeing
lpfc: Fix locking for lpfc_hba_down_post
lpfc: Fix dynamic transitions of FirstBurst from on to off
hpsa: fix handling of hpsa_volume_offline return value
hpsa: return -ENOMEM not -1 on kzalloc failure in hpsa_get_device_id
hpsa: remove messages about volume status VPD inquiry page not supported
...
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/scsi/hpsa.c | 266 | ||||
-rw-r--r-- | drivers/scsi/hpsa.h | 42 | ||||
-rw-r--r-- | drivers/scsi/hpsa_cmd.h | 49 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc.h | 3 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 23 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_bsg.c | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_bsg.h | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_crtn.h | 6 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_debugfs.c | 4 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_els.c | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hbadisc.c | 5 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hw.h | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_hw4.h | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 258 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_mem.c | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.c | 60 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_scsi.h | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 297 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.h | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_sli4.h | 2 | ||||
-rw-r--r-- | drivers/scsi/lpfc/lpfc_version.h | 6 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 16 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_target.c | 15 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_target.h | 16 |
24 files changed, 715 insertions, 369 deletions
diff --git a/drivers/scsi/hpsa.c b/drivers/scsi/hpsa.c index 5858600bfe59..31184b35370f 100644 --- a/drivers/scsi/hpsa.c +++ b/drivers/scsi/hpsa.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #include <linux/bitmap.h> | 48 | #include <linux/bitmap.h> |
49 | #include <linux/atomic.h> | 49 | #include <linux/atomic.h> |
50 | #include <linux/jiffies.h> | 50 | #include <linux/jiffies.h> |
51 | #include <linux/percpu.h> | ||
51 | #include <asm/div64.h> | 52 | #include <asm/div64.h> |
52 | #include "hpsa_cmd.h" | 53 | #include "hpsa_cmd.h" |
53 | #include "hpsa.h" | 54 | #include "hpsa.h" |
@@ -193,7 +194,8 @@ static int number_of_controllers; | |||
193 | static irqreturn_t do_hpsa_intr_intx(int irq, void *dev_id); | 194 | static irqreturn_t do_hpsa_intr_intx(int irq, void *dev_id); |
194 | static irqreturn_t do_hpsa_intr_msi(int irq, void *dev_id); | 195 | static irqreturn_t do_hpsa_intr_msi(int irq, void *dev_id); |
195 | static int hpsa_ioctl(struct scsi_device *dev, int cmd, void *arg); | 196 | static int hpsa_ioctl(struct scsi_device *dev, int cmd, void *arg); |
196 | static void start_io(struct ctlr_info *h); | 197 | static void lock_and_start_io(struct ctlr_info *h); |
198 | static void start_io(struct ctlr_info *h, unsigned long *flags); | ||
197 | 199 | ||
198 | #ifdef CONFIG_COMPAT | 200 | #ifdef CONFIG_COMPAT |
199 | static int hpsa_compat_ioctl(struct scsi_device *dev, int cmd, void *arg); | 201 | static int hpsa_compat_ioctl(struct scsi_device *dev, int cmd, void *arg); |
@@ -695,7 +697,7 @@ static inline void addQ(struct list_head *list, struct CommandList *c) | |||
695 | static inline u32 next_command(struct ctlr_info *h, u8 q) | 697 | static inline u32 next_command(struct ctlr_info *h, u8 q) |
696 | { | 698 | { |
697 | u32 a; | 699 | u32 a; |
698 | struct reply_pool *rq = &h->reply_queue[q]; | 700 | struct reply_queue_buffer *rq = &h->reply_queue[q]; |
699 | unsigned long flags; | 701 | unsigned long flags; |
700 | 702 | ||
701 | if (h->transMethod & CFGTBL_Trans_io_accel1) | 703 | if (h->transMethod & CFGTBL_Trans_io_accel1) |
@@ -844,8 +846,8 @@ static void enqueue_cmd_and_start_io(struct ctlr_info *h, | |||
844 | spin_lock_irqsave(&h->lock, flags); | 846 | spin_lock_irqsave(&h->lock, flags); |
845 | addQ(&h->reqQ, c); | 847 | addQ(&h->reqQ, c); |
846 | h->Qdepth++; | 848 | h->Qdepth++; |
849 | start_io(h, &flags); | ||
847 | spin_unlock_irqrestore(&h->lock, flags); | 850 | spin_unlock_irqrestore(&h->lock, flags); |
848 | start_io(h); | ||
849 | } | 851 | } |
850 | 852 | ||
851 | static inline void removeQ(struct CommandList *c) | 853 | static inline void removeQ(struct CommandList *c) |
@@ -1554,9 +1556,13 @@ static int handle_ioaccel_mode2_error(struct ctlr_info *h, | |||
1554 | dev_warn(&h->pdev->dev, | 1556 | dev_warn(&h->pdev->dev, |
1555 | "%s: task complete with check condition.\n", | 1557 | "%s: task complete with check condition.\n", |
1556 | "HP SSD Smart Path"); | 1558 | "HP SSD Smart Path"); |
1559 | cmd->result |= SAM_STAT_CHECK_CONDITION; | ||
1557 | if (c2->error_data.data_present != | 1560 | if (c2->error_data.data_present != |
1558 | IOACCEL2_SENSE_DATA_PRESENT) | 1561 | IOACCEL2_SENSE_DATA_PRESENT) { |
1562 | memset(cmd->sense_buffer, 0, | ||
1563 | SCSI_SENSE_BUFFERSIZE); | ||
1559 | break; | 1564 | break; |
1565 | } | ||
1560 | /* copy the sense data */ | 1566 | /* copy the sense data */ |
1561 | data_len = c2->error_data.sense_data_len; | 1567 | data_len = c2->error_data.sense_data_len; |
1562 | if (data_len > SCSI_SENSE_BUFFERSIZE) | 1568 | if (data_len > SCSI_SENSE_BUFFERSIZE) |
@@ -1566,7 +1572,6 @@ static int handle_ioaccel_mode2_error(struct ctlr_info *h, | |||
1566 | sizeof(c2->error_data.sense_data_buff); | 1572 | sizeof(c2->error_data.sense_data_buff); |
1567 | memcpy(cmd->sense_buffer, | 1573 | memcpy(cmd->sense_buffer, |
1568 | c2->error_data.sense_data_buff, data_len); | 1574 | c2->error_data.sense_data_buff, data_len); |
1569 | cmd->result |= SAM_STAT_CHECK_CONDITION; | ||
1570 | retry = 1; | 1575 | retry = 1; |
1571 | break; | 1576 | break; |
1572 | case IOACCEL2_STATUS_SR_TASK_COMP_BUSY: | 1577 | case IOACCEL2_STATUS_SR_TASK_COMP_BUSY: |
@@ -1651,16 +1656,6 @@ static void process_ioaccel2_completion(struct ctlr_info *h, | |||
1651 | if (is_logical_dev_addr_mode(dev->scsi3addr) && | 1656 | if (is_logical_dev_addr_mode(dev->scsi3addr) && |
1652 | c2->error_data.serv_response == | 1657 | c2->error_data.serv_response == |
1653 | IOACCEL2_SERV_RESPONSE_FAILURE) { | 1658 | IOACCEL2_SERV_RESPONSE_FAILURE) { |
1654 | if (c2->error_data.status == | ||
1655 | IOACCEL2_STATUS_SR_IOACCEL_DISABLED) | ||
1656 | dev_warn(&h->pdev->dev, | ||
1657 | "%s: Path is unavailable, retrying on standard path.\n", | ||
1658 | "HP SSD Smart Path"); | ||
1659 | else | ||
1660 | dev_warn(&h->pdev->dev, | ||
1661 | "%s: Error 0x%02x, retrying on standard path.\n", | ||
1662 | "HP SSD Smart Path", c2->error_data.status); | ||
1663 | |||
1664 | dev->offload_enabled = 0; | 1659 | dev->offload_enabled = 0; |
1665 | h->drv_req_rescan = 1; /* schedule controller for a rescan */ | 1660 | h->drv_req_rescan = 1; /* schedule controller for a rescan */ |
1666 | cmd->result = DID_SOFT_ERROR << 16; | 1661 | cmd->result = DID_SOFT_ERROR << 16; |
@@ -1991,20 +1986,26 @@ static inline void hpsa_scsi_do_simple_cmd_core(struct ctlr_info *h, | |||
1991 | wait_for_completion(&wait); | 1986 | wait_for_completion(&wait); |
1992 | } | 1987 | } |
1993 | 1988 | ||
1989 | static u32 lockup_detected(struct ctlr_info *h) | ||
1990 | { | ||
1991 | int cpu; | ||
1992 | u32 rc, *lockup_detected; | ||
1993 | |||
1994 | cpu = get_cpu(); | ||
1995 | lockup_detected = per_cpu_ptr(h->lockup_detected, cpu); | ||
1996 | rc = *lockup_detected; | ||
1997 | put_cpu(); | ||
1998 | return rc; | ||
1999 | } | ||
2000 | |||
1994 | static void hpsa_scsi_do_simple_cmd_core_if_no_lockup(struct ctlr_info *h, | 2001 | static void hpsa_scsi_do_simple_cmd_core_if_no_lockup(struct ctlr_info *h, |
1995 | struct CommandList *c) | 2002 | struct CommandList *c) |
1996 | { | 2003 | { |
1997 | unsigned long flags; | ||
1998 | |||
1999 | /* If controller lockup detected, fake a hardware error. */ | 2004 | /* If controller lockup detected, fake a hardware error. */ |
2000 | spin_lock_irqsave(&h->lock, flags); | 2005 | if (unlikely(lockup_detected(h))) |
2001 | if (unlikely(h->lockup_detected)) { | ||
2002 | spin_unlock_irqrestore(&h->lock, flags); | ||
2003 | c->err_info->CommandStatus = CMD_HARDWARE_ERR; | 2006 | c->err_info->CommandStatus = CMD_HARDWARE_ERR; |
2004 | } else { | 2007 | else |
2005 | spin_unlock_irqrestore(&h->lock, flags); | ||
2006 | hpsa_scsi_do_simple_cmd_core(h, c); | 2008 | hpsa_scsi_do_simple_cmd_core(h, c); |
2007 | } | ||
2008 | } | 2009 | } |
2009 | 2010 | ||
2010 | #define MAX_DRIVER_CMD_RETRIES 25 | 2011 | #define MAX_DRIVER_CMD_RETRIES 25 |
@@ -2429,7 +2430,7 @@ static int hpsa_get_device_id(struct ctlr_info *h, unsigned char *scsi3addr, | |||
2429 | buflen = 16; | 2430 | buflen = 16; |
2430 | buf = kzalloc(64, GFP_KERNEL); | 2431 | buf = kzalloc(64, GFP_KERNEL); |
2431 | if (!buf) | 2432 | if (!buf) |
2432 | return -1; | 2433 | return -ENOMEM; |
2433 | rc = hpsa_scsi_do_inquiry(h, scsi3addr, VPD_PAGE | 0x83, buf, 64); | 2434 | rc = hpsa_scsi_do_inquiry(h, scsi3addr, VPD_PAGE | 0x83, buf, 64); |
2434 | if (rc == 0) | 2435 | if (rc == 0) |
2435 | memcpy(device_id, &buf[8], buflen); | 2436 | memcpy(device_id, &buf[8], buflen); |
@@ -2515,27 +2516,21 @@ static int hpsa_get_volume_status(struct ctlr_info *h, | |||
2515 | return HPSA_VPD_LV_STATUS_UNSUPPORTED; | 2516 | return HPSA_VPD_LV_STATUS_UNSUPPORTED; |
2516 | 2517 | ||
2517 | /* Does controller have VPD for logical volume status? */ | 2518 | /* Does controller have VPD for logical volume status? */ |
2518 | if (!hpsa_vpd_page_supported(h, scsi3addr, HPSA_VPD_LV_STATUS)) { | 2519 | if (!hpsa_vpd_page_supported(h, scsi3addr, HPSA_VPD_LV_STATUS)) |
2519 | dev_warn(&h->pdev->dev, "Logical volume status VPD page is unsupported.\n"); | ||
2520 | goto exit_failed; | 2520 | goto exit_failed; |
2521 | } | ||
2522 | 2521 | ||
2523 | /* Get the size of the VPD return buffer */ | 2522 | /* Get the size of the VPD return buffer */ |
2524 | rc = hpsa_scsi_do_inquiry(h, scsi3addr, VPD_PAGE | HPSA_VPD_LV_STATUS, | 2523 | rc = hpsa_scsi_do_inquiry(h, scsi3addr, VPD_PAGE | HPSA_VPD_LV_STATUS, |
2525 | buf, HPSA_VPD_HEADER_SZ); | 2524 | buf, HPSA_VPD_HEADER_SZ); |
2526 | if (rc != 0) { | 2525 | if (rc != 0) |
2527 | dev_warn(&h->pdev->dev, "Logical volume status VPD inquiry failed.\n"); | ||
2528 | goto exit_failed; | 2526 | goto exit_failed; |
2529 | } | ||
2530 | size = buf[3]; | 2527 | size = buf[3]; |
2531 | 2528 | ||
2532 | /* Now get the whole VPD buffer */ | 2529 | /* Now get the whole VPD buffer */ |
2533 | rc = hpsa_scsi_do_inquiry(h, scsi3addr, VPD_PAGE | HPSA_VPD_LV_STATUS, | 2530 | rc = hpsa_scsi_do_inquiry(h, scsi3addr, VPD_PAGE | HPSA_VPD_LV_STATUS, |
2534 | buf, size + HPSA_VPD_HEADER_SZ); | 2531 | buf, size + HPSA_VPD_HEADER_SZ); |
2535 | if (rc != 0) { | 2532 | if (rc != 0) |
2536 | dev_warn(&h->pdev->dev, "Logical volume status VPD inquiry failed.\n"); | ||
2537 | goto exit_failed; | 2533 | goto exit_failed; |
2538 | } | ||
2539 | status = buf[4]; /* status byte */ | 2534 | status = buf[4]; /* status byte */ |
2540 | 2535 | ||
2541 | kfree(buf); | 2536 | kfree(buf); |
@@ -2548,11 +2543,11 @@ exit_failed: | |||
2548 | /* Determine offline status of a volume. | 2543 | /* Determine offline status of a volume. |
2549 | * Return either: | 2544 | * Return either: |
2550 | * 0 (not offline) | 2545 | * 0 (not offline) |
2551 | * -1 (offline for unknown reasons) | 2546 | * 0xff (offline for unknown reasons) |
2552 | * # (integer code indicating one of several NOT READY states | 2547 | * # (integer code indicating one of several NOT READY states |
2553 | * describing why a volume is to be kept offline) | 2548 | * describing why a volume is to be kept offline) |
2554 | */ | 2549 | */ |
2555 | static unsigned char hpsa_volume_offline(struct ctlr_info *h, | 2550 | static int hpsa_volume_offline(struct ctlr_info *h, |
2556 | unsigned char scsi3addr[]) | 2551 | unsigned char scsi3addr[]) |
2557 | { | 2552 | { |
2558 | struct CommandList *c; | 2553 | struct CommandList *c; |
@@ -2651,11 +2646,15 @@ static int hpsa_update_device_info(struct ctlr_info *h, | |||
2651 | 2646 | ||
2652 | if (this_device->devtype == TYPE_DISK && | 2647 | if (this_device->devtype == TYPE_DISK && |
2653 | is_logical_dev_addr_mode(scsi3addr)) { | 2648 | is_logical_dev_addr_mode(scsi3addr)) { |
2649 | int volume_offline; | ||
2650 | |||
2654 | hpsa_get_raid_level(h, scsi3addr, &this_device->raid_level); | 2651 | hpsa_get_raid_level(h, scsi3addr, &this_device->raid_level); |
2655 | if (h->fw_support & MISC_FW_RAID_OFFLOAD_BASIC) | 2652 | if (h->fw_support & MISC_FW_RAID_OFFLOAD_BASIC) |
2656 | hpsa_get_ioaccel_status(h, scsi3addr, this_device); | 2653 | hpsa_get_ioaccel_status(h, scsi3addr, this_device); |
2657 | this_device->volume_offline = | 2654 | volume_offline = hpsa_volume_offline(h, scsi3addr); |
2658 | hpsa_volume_offline(h, scsi3addr); | 2655 | if (volume_offline < 0 || volume_offline > 0xff) |
2656 | volume_offline = HPSA_VPD_LV_STATUS_UNSUPPORTED; | ||
2657 | this_device->volume_offline = volume_offline & 0xff; | ||
2659 | } else { | 2658 | } else { |
2660 | this_device->raid_level = RAID_UNKNOWN; | 2659 | this_device->raid_level = RAID_UNKNOWN; |
2661 | this_device->offload_config = 0; | 2660 | this_device->offload_config = 0; |
@@ -2861,26 +2860,20 @@ static int hpsa_get_pdisk_of_ioaccel2(struct ctlr_info *h, | |||
2861 | nphysicals = be32_to_cpu(*((__be32 *)physicals->LUNListLength)) / | 2860 | nphysicals = be32_to_cpu(*((__be32 *)physicals->LUNListLength)) / |
2862 | responsesize; | 2861 | responsesize; |
2863 | 2862 | ||
2864 | |||
2865 | /* find ioaccel2 handle in list of physicals: */ | 2863 | /* find ioaccel2 handle in list of physicals: */ |
2866 | for (i = 0; i < nphysicals; i++) { | 2864 | for (i = 0; i < nphysicals; i++) { |
2865 | struct ext_report_lun_entry *entry = &physicals->LUN[i]; | ||
2866 | |||
2867 | /* handle is in bytes 28-31 of each lun */ | 2867 | /* handle is in bytes 28-31 of each lun */ |
2868 | if (memcmp(&((struct ReportExtendedLUNdata *) | 2868 | if (entry->ioaccel_handle != find) |
2869 | physicals)->LUN[i][20], &find, 4) != 0) { | ||
2870 | continue; /* didn't match */ | 2869 | continue; /* didn't match */ |
2871 | } | ||
2872 | found = 1; | 2870 | found = 1; |
2873 | memcpy(scsi3addr, &((struct ReportExtendedLUNdata *) | 2871 | memcpy(scsi3addr, entry->lunid, 8); |
2874 | physicals)->LUN[i][0], 8); | ||
2875 | if (h->raid_offload_debug > 0) | 2872 | if (h->raid_offload_debug > 0) |
2876 | dev_info(&h->pdev->dev, | 2873 | dev_info(&h->pdev->dev, |
2877 | "%s: Searched h=0x%08x, Found h=0x%08x, scsiaddr 0x%02x%02x%02x%02x%02x%02x%02x%02x\n", | 2874 | "%s: Searched h=0x%08x, Found h=0x%08x, scsiaddr 0x%8phN\n", |
2878 | __func__, find, | 2875 | __func__, find, |
2879 | ((struct ReportExtendedLUNdata *) | 2876 | entry->ioaccel_handle, scsi3addr); |
2880 | physicals)->LUN[i][20], | ||
2881 | scsi3addr[0], scsi3addr[1], scsi3addr[2], | ||
2882 | scsi3addr[3], scsi3addr[4], scsi3addr[5], | ||
2883 | scsi3addr[6], scsi3addr[7]); | ||
2884 | break; /* found it */ | 2877 | break; /* found it */ |
2885 | } | 2878 | } |
2886 | 2879 | ||
@@ -2965,7 +2958,8 @@ u8 *figure_lunaddrbytes(struct ctlr_info *h, int raid_ctlr_position, int i, | |||
2965 | return RAID_CTLR_LUNID; | 2958 | return RAID_CTLR_LUNID; |
2966 | 2959 | ||
2967 | if (i < logicals_start) | 2960 | if (i < logicals_start) |
2968 | return &physdev_list->LUN[i - (raid_ctlr_position == 0)][0]; | 2961 | return &physdev_list->LUN[i - |
2962 | (raid_ctlr_position == 0)].lunid[0]; | ||
2969 | 2963 | ||
2970 | if (i < last_device) | 2964 | if (i < last_device) |
2971 | return &logdev_list->LUN[i - nphysicals - | 2965 | return &logdev_list->LUN[i - nphysicals - |
@@ -3074,7 +3068,7 @@ static void hpsa_update_scsi_devices(struct ctlr_info *h, int hostno) | |||
3074 | ndev_allocated++; | 3068 | ndev_allocated++; |
3075 | } | 3069 | } |
3076 | 3070 | ||
3077 | if (unlikely(is_scsi_rev_5(h))) | 3071 | if (is_scsi_rev_5(h)) |
3078 | raid_ctlr_position = 0; | 3072 | raid_ctlr_position = 0; |
3079 | else | 3073 | else |
3080 | raid_ctlr_position = nphysicals + nlogicals; | 3074 | raid_ctlr_position = nphysicals + nlogicals; |
@@ -3971,7 +3965,6 @@ static int hpsa_scsi_queue_command_lck(struct scsi_cmnd *cmd, | |||
3971 | struct hpsa_scsi_dev_t *dev; | 3965 | struct hpsa_scsi_dev_t *dev; |
3972 | unsigned char scsi3addr[8]; | 3966 | unsigned char scsi3addr[8]; |
3973 | struct CommandList *c; | 3967 | struct CommandList *c; |
3974 | unsigned long flags; | ||
3975 | int rc = 0; | 3968 | int rc = 0; |
3976 | 3969 | ||
3977 | /* Get the ptr to our adapter structure out of cmd->host. */ | 3970 | /* Get the ptr to our adapter structure out of cmd->host. */ |
@@ -3984,14 +3977,11 @@ static int hpsa_scsi_queue_command_lck(struct scsi_cmnd *cmd, | |||
3984 | } | 3977 | } |
3985 | memcpy(scsi3addr, dev->scsi3addr, sizeof(scsi3addr)); | 3978 | memcpy(scsi3addr, dev->scsi3addr, sizeof(scsi3addr)); |
3986 | 3979 | ||
3987 | spin_lock_irqsave(&h->lock, flags); | 3980 | if (unlikely(lockup_detected(h))) { |
3988 | if (unlikely(h->lockup_detected)) { | ||
3989 | spin_unlock_irqrestore(&h->lock, flags); | ||
3990 | cmd->result = DID_ERROR << 16; | 3981 | cmd->result = DID_ERROR << 16; |
3991 | done(cmd); | 3982 | done(cmd); |
3992 | return 0; | 3983 | return 0; |
3993 | } | 3984 | } |
3994 | spin_unlock_irqrestore(&h->lock, flags); | ||
3995 | c = cmd_alloc(h); | 3985 | c = cmd_alloc(h); |
3996 | if (c == NULL) { /* trouble... */ | 3986 | if (c == NULL) { /* trouble... */ |
3997 | dev_err(&h->pdev->dev, "cmd_alloc returned NULL!\n"); | 3987 | dev_err(&h->pdev->dev, "cmd_alloc returned NULL!\n"); |
@@ -4103,16 +4093,13 @@ static int do_not_scan_if_controller_locked_up(struct ctlr_info *h) | |||
4103 | * we can prevent new rescan threads from piling up on a | 4093 | * we can prevent new rescan threads from piling up on a |
4104 | * locked up controller. | 4094 | * locked up controller. |
4105 | */ | 4095 | */ |
4106 | spin_lock_irqsave(&h->lock, flags); | 4096 | if (unlikely(lockup_detected(h))) { |
4107 | if (unlikely(h->lockup_detected)) { | ||
4108 | spin_unlock_irqrestore(&h->lock, flags); | ||
4109 | spin_lock_irqsave(&h->scan_lock, flags); | 4097 | spin_lock_irqsave(&h->scan_lock, flags); |
4110 | h->scan_finished = 1; | 4098 | h->scan_finished = 1; |
4111 | wake_up_all(&h->scan_wait_queue); | 4099 | wake_up_all(&h->scan_wait_queue); |
4112 | spin_unlock_irqrestore(&h->scan_lock, flags); | 4100 | spin_unlock_irqrestore(&h->scan_lock, flags); |
4113 | return 1; | 4101 | return 1; |
4114 | } | 4102 | } |
4115 | spin_unlock_irqrestore(&h->lock, flags); | ||
4116 | return 0; | 4103 | return 0; |
4117 | } | 4104 | } |
4118 | 4105 | ||
@@ -4963,7 +4950,7 @@ static int hpsa_passthru_ioctl(struct ctlr_info *h, void __user *argp) | |||
4963 | buff = kmalloc(iocommand.buf_size, GFP_KERNEL); | 4950 | buff = kmalloc(iocommand.buf_size, GFP_KERNEL); |
4964 | if (buff == NULL) | 4951 | if (buff == NULL) |
4965 | return -EFAULT; | 4952 | return -EFAULT; |
4966 | if (iocommand.Request.Type.Direction == XFER_WRITE) { | 4953 | if (iocommand.Request.Type.Direction & XFER_WRITE) { |
4967 | /* Copy the data into the buffer we created */ | 4954 | /* Copy the data into the buffer we created */ |
4968 | if (copy_from_user(buff, iocommand.buf, | 4955 | if (copy_from_user(buff, iocommand.buf, |
4969 | iocommand.buf_size)) { | 4956 | iocommand.buf_size)) { |
@@ -5026,7 +5013,7 @@ static int hpsa_passthru_ioctl(struct ctlr_info *h, void __user *argp) | |||
5026 | rc = -EFAULT; | 5013 | rc = -EFAULT; |
5027 | goto out; | 5014 | goto out; |
5028 | } | 5015 | } |
5029 | if (iocommand.Request.Type.Direction == XFER_READ && | 5016 | if ((iocommand.Request.Type.Direction & XFER_READ) && |
5030 | iocommand.buf_size > 0) { | 5017 | iocommand.buf_size > 0) { |
5031 | /* Copy the data out of the buffer we created */ | 5018 | /* Copy the data out of the buffer we created */ |
5032 | if (copy_to_user(iocommand.buf, buff, iocommand.buf_size)) { | 5019 | if (copy_to_user(iocommand.buf, buff, iocommand.buf_size)) { |
@@ -5103,7 +5090,7 @@ static int hpsa_big_passthru_ioctl(struct ctlr_info *h, void __user *argp) | |||
5103 | status = -ENOMEM; | 5090 | status = -ENOMEM; |
5104 | goto cleanup1; | 5091 | goto cleanup1; |
5105 | } | 5092 | } |
5106 | if (ioc->Request.Type.Direction == XFER_WRITE) { | 5093 | if (ioc->Request.Type.Direction & XFER_WRITE) { |
5107 | if (copy_from_user(buff[sg_used], data_ptr, sz)) { | 5094 | if (copy_from_user(buff[sg_used], data_ptr, sz)) { |
5108 | status = -ENOMEM; | 5095 | status = -ENOMEM; |
5109 | goto cleanup1; | 5096 | goto cleanup1; |
@@ -5155,7 +5142,7 @@ static int hpsa_big_passthru_ioctl(struct ctlr_info *h, void __user *argp) | |||
5155 | status = -EFAULT; | 5142 | status = -EFAULT; |
5156 | goto cleanup0; | 5143 | goto cleanup0; |
5157 | } | 5144 | } |
5158 | if (ioc->Request.Type.Direction == XFER_READ && ioc->buf_size > 0) { | 5145 | if ((ioc->Request.Type.Direction & XFER_READ) && ioc->buf_size > 0) { |
5159 | /* Copy the data out of the buffer we created */ | 5146 | /* Copy the data out of the buffer we created */ |
5160 | BYTE __user *ptr = ioc->buf; | 5147 | BYTE __user *ptr = ioc->buf; |
5161 | for (i = 0; i < sg_used; i++) { | 5148 | for (i = 0; i < sg_used; i++) { |
@@ -5459,13 +5446,12 @@ static void __iomem *remap_pci_mem(ulong base, ulong size) | |||
5459 | 5446 | ||
5460 | /* Takes cmds off the submission queue and sends them to the hardware, | 5447 | /* Takes cmds off the submission queue and sends them to the hardware, |
5461 | * then puts them on the queue of cmds waiting for completion. | 5448 | * then puts them on the queue of cmds waiting for completion. |
5449 | * Assumes h->lock is held | ||
5462 | */ | 5450 | */ |
5463 | static void start_io(struct ctlr_info *h) | 5451 | static void start_io(struct ctlr_info *h, unsigned long *flags) |
5464 | { | 5452 | { |
5465 | struct CommandList *c; | 5453 | struct CommandList *c; |
5466 | unsigned long flags; | ||
5467 | 5454 | ||
5468 | spin_lock_irqsave(&h->lock, flags); | ||
5469 | while (!list_empty(&h->reqQ)) { | 5455 | while (!list_empty(&h->reqQ)) { |
5470 | c = list_entry(h->reqQ.next, struct CommandList, list); | 5456 | c = list_entry(h->reqQ.next, struct CommandList, list); |
5471 | /* can't do anything if fifo is full */ | 5457 | /* can't do anything if fifo is full */ |
@@ -5488,14 +5474,20 @@ static void start_io(struct ctlr_info *h) | |||
5488 | * condition. | 5474 | * condition. |
5489 | */ | 5475 | */ |
5490 | h->commands_outstanding++; | 5476 | h->commands_outstanding++; |
5491 | if (h->commands_outstanding > h->max_outstanding) | ||
5492 | h->max_outstanding = h->commands_outstanding; | ||
5493 | 5477 | ||
5494 | /* Tell the controller execute command */ | 5478 | /* Tell the controller execute command */ |
5495 | spin_unlock_irqrestore(&h->lock, flags); | 5479 | spin_unlock_irqrestore(&h->lock, *flags); |
5496 | h->access.submit_command(h, c); | 5480 | h->access.submit_command(h, c); |
5497 | spin_lock_irqsave(&h->lock, flags); | 5481 | spin_lock_irqsave(&h->lock, *flags); |
5498 | } | 5482 | } |
5483 | } | ||
5484 | |||
5485 | static void lock_and_start_io(struct ctlr_info *h) | ||
5486 | { | ||
5487 | unsigned long flags; | ||
5488 | |||
5489 | spin_lock_irqsave(&h->lock, flags); | ||
5490 | start_io(h, &flags); | ||
5499 | spin_unlock_irqrestore(&h->lock, flags); | 5491 | spin_unlock_irqrestore(&h->lock, flags); |
5500 | } | 5492 | } |
5501 | 5493 | ||
@@ -5563,7 +5555,7 @@ static inline void finish_cmd(struct CommandList *c) | |||
5563 | else if (c->cmd_type == CMD_IOCTL_PEND) | 5555 | else if (c->cmd_type == CMD_IOCTL_PEND) |
5564 | complete(c->waiting); | 5556 | complete(c->waiting); |
5565 | if (unlikely(io_may_be_stalled)) | 5557 | if (unlikely(io_may_be_stalled)) |
5566 | start_io(h); | 5558 | lock_and_start_io(h); |
5567 | } | 5559 | } |
5568 | 5560 | ||
5569 | static inline u32 hpsa_tag_contains_index(u32 tag) | 5561 | static inline u32 hpsa_tag_contains_index(u32 tag) |
@@ -5840,12 +5832,12 @@ static int hpsa_controller_hard_reset(struct pci_dev *pdev, | |||
5840 | dev_info(&pdev->dev, "using doorbell to reset controller\n"); | 5832 | dev_info(&pdev->dev, "using doorbell to reset controller\n"); |
5841 | writel(use_doorbell, vaddr + SA5_DOORBELL); | 5833 | writel(use_doorbell, vaddr + SA5_DOORBELL); |
5842 | 5834 | ||
5843 | /* PMC hardware guys tell us we need a 5 second delay after | 5835 | /* PMC hardware guys tell us we need a 10 second delay after |
5844 | * doorbell reset and before any attempt to talk to the board | 5836 | * doorbell reset and before any attempt to talk to the board |
5845 | * at all to ensure that this actually works and doesn't fall | 5837 | * at all to ensure that this actually works and doesn't fall |
5846 | * over in some weird corner cases. | 5838 | * over in some weird corner cases. |
5847 | */ | 5839 | */ |
5848 | msleep(5000); | 5840 | msleep(10000); |
5849 | } else { /* Try to do it the PCI power state way */ | 5841 | } else { /* Try to do it the PCI power state way */ |
5850 | 5842 | ||
5851 | /* Quoting from the Open CISS Specification: "The Power | 5843 | /* Quoting from the Open CISS Specification: "The Power |
@@ -6166,6 +6158,8 @@ static void hpsa_interrupt_mode(struct ctlr_info *h) | |||
6166 | if (pci_find_capability(h->pdev, PCI_CAP_ID_MSIX)) { | 6158 | if (pci_find_capability(h->pdev, PCI_CAP_ID_MSIX)) { |
6167 | dev_info(&h->pdev->dev, "MSIX\n"); | 6159 | dev_info(&h->pdev->dev, "MSIX\n"); |
6168 | h->msix_vector = MAX_REPLY_QUEUES; | 6160 | h->msix_vector = MAX_REPLY_QUEUES; |
6161 | if (h->msix_vector > num_online_cpus()) | ||
6162 | h->msix_vector = num_online_cpus(); | ||
6169 | err = pci_enable_msix(h->pdev, hpsa_msix_entries, | 6163 | err = pci_enable_msix(h->pdev, hpsa_msix_entries, |
6170 | h->msix_vector); | 6164 | h->msix_vector); |
6171 | if (err > 0) { | 6165 | if (err > 0) { |
@@ -6615,6 +6609,17 @@ static void hpsa_free_cmd_pool(struct ctlr_info *h) | |||
6615 | h->ioaccel_cmd_pool, h->ioaccel_cmd_pool_dhandle); | 6609 | h->ioaccel_cmd_pool, h->ioaccel_cmd_pool_dhandle); |
6616 | } | 6610 | } |
6617 | 6611 | ||
6612 | static void hpsa_irq_affinity_hints(struct ctlr_info *h) | ||
6613 | { | ||
6614 | int i, cpu, rc; | ||
6615 | |||
6616 | cpu = cpumask_first(cpu_online_mask); | ||
6617 | for (i = 0; i < h->msix_vector; i++) { | ||
6618 | rc = irq_set_affinity_hint(h->intr[i], get_cpu_mask(cpu)); | ||
6619 | cpu = cpumask_next(cpu, cpu_online_mask); | ||
6620 | } | ||
6621 | } | ||
6622 | |||
6618 | static int hpsa_request_irq(struct ctlr_info *h, | 6623 | static int hpsa_request_irq(struct ctlr_info *h, |
6619 | irqreturn_t (*msixhandler)(int, void *), | 6624 | irqreturn_t (*msixhandler)(int, void *), |
6620 | irqreturn_t (*intxhandler)(int, void *)) | 6625 | irqreturn_t (*intxhandler)(int, void *)) |
@@ -6634,6 +6639,7 @@ static int hpsa_request_irq(struct ctlr_info *h, | |||
6634 | rc = request_irq(h->intr[i], msixhandler, | 6639 | rc = request_irq(h->intr[i], msixhandler, |
6635 | 0, h->devname, | 6640 | 0, h->devname, |
6636 | &h->q[i]); | 6641 | &h->q[i]); |
6642 | hpsa_irq_affinity_hints(h); | ||
6637 | } else { | 6643 | } else { |
6638 | /* Use single reply pool */ | 6644 | /* Use single reply pool */ |
6639 | if (h->msix_vector > 0 || h->msi_vector) { | 6645 | if (h->msix_vector > 0 || h->msi_vector) { |
@@ -6685,12 +6691,15 @@ static void free_irqs(struct ctlr_info *h) | |||
6685 | if (!h->msix_vector || h->intr_mode != PERF_MODE_INT) { | 6691 | if (!h->msix_vector || h->intr_mode != PERF_MODE_INT) { |
6686 | /* Single reply queue, only one irq to free */ | 6692 | /* Single reply queue, only one irq to free */ |
6687 | i = h->intr_mode; | 6693 | i = h->intr_mode; |
6694 | irq_set_affinity_hint(h->intr[i], NULL); | ||
6688 | free_irq(h->intr[i], &h->q[i]); | 6695 | free_irq(h->intr[i], &h->q[i]); |
6689 | return; | 6696 | return; |
6690 | } | 6697 | } |
6691 | 6698 | ||
6692 | for (i = 0; i < h->msix_vector; i++) | 6699 | for (i = 0; i < h->msix_vector; i++) { |
6700 | irq_set_affinity_hint(h->intr[i], NULL); | ||
6693 | free_irq(h->intr[i], &h->q[i]); | 6701 | free_irq(h->intr[i], &h->q[i]); |
6702 | } | ||
6694 | } | 6703 | } |
6695 | 6704 | ||
6696 | static void hpsa_free_irqs_and_disable_msix(struct ctlr_info *h) | 6705 | static void hpsa_free_irqs_and_disable_msix(struct ctlr_info *h) |
@@ -6707,6 +6716,20 @@ static void hpsa_free_irqs_and_disable_msix(struct ctlr_info *h) | |||
6707 | #endif /* CONFIG_PCI_MSI */ | 6716 | #endif /* CONFIG_PCI_MSI */ |
6708 | } | 6717 | } |
6709 | 6718 | ||
6719 | static void hpsa_free_reply_queues(struct ctlr_info *h) | ||
6720 | { | ||
6721 | int i; | ||
6722 | |||
6723 | for (i = 0; i < h->nreply_queues; i++) { | ||
6724 | if (!h->reply_queue[i].head) | ||
6725 | continue; | ||
6726 | pci_free_consistent(h->pdev, h->reply_queue_size, | ||
6727 | h->reply_queue[i].head, h->reply_queue[i].busaddr); | ||
6728 | h->reply_queue[i].head = NULL; | ||
6729 | h->reply_queue[i].busaddr = 0; | ||
6730 | } | ||
6731 | } | ||
6732 | |||
6710 | static void hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h) | 6733 | static void hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h) |
6711 | { | 6734 | { |
6712 | hpsa_free_irqs_and_disable_msix(h); | 6735 | hpsa_free_irqs_and_disable_msix(h); |
@@ -6714,8 +6737,7 @@ static void hpsa_undo_allocations_after_kdump_soft_reset(struct ctlr_info *h) | |||
6714 | hpsa_free_cmd_pool(h); | 6737 | hpsa_free_cmd_pool(h); |
6715 | kfree(h->ioaccel1_blockFetchTable); | 6738 | kfree(h->ioaccel1_blockFetchTable); |
6716 | kfree(h->blockFetchTable); | 6739 | kfree(h->blockFetchTable); |
6717 | pci_free_consistent(h->pdev, h->reply_pool_size, | 6740 | hpsa_free_reply_queues(h); |
6718 | h->reply_pool, h->reply_pool_dhandle); | ||
6719 | if (h->vaddr) | 6741 | if (h->vaddr) |
6720 | iounmap(h->vaddr); | 6742 | iounmap(h->vaddr); |
6721 | if (h->transtable) | 6743 | if (h->transtable) |
@@ -6740,16 +6762,38 @@ static void fail_all_cmds_on_list(struct ctlr_info *h, struct list_head *list) | |||
6740 | } | 6762 | } |
6741 | } | 6763 | } |
6742 | 6764 | ||
6765 | static void set_lockup_detected_for_all_cpus(struct ctlr_info *h, u32 value) | ||
6766 | { | ||
6767 | int i, cpu; | ||
6768 | |||
6769 | cpu = cpumask_first(cpu_online_mask); | ||
6770 | for (i = 0; i < num_online_cpus(); i++) { | ||
6771 | u32 *lockup_detected; | ||
6772 | lockup_detected = per_cpu_ptr(h->lockup_detected, cpu); | ||
6773 | *lockup_detected = value; | ||
6774 | cpu = cpumask_next(cpu, cpu_online_mask); | ||
6775 | } | ||
6776 | wmb(); /* be sure the per-cpu variables are out to memory */ | ||
6777 | } | ||
6778 | |||
6743 | static void controller_lockup_detected(struct ctlr_info *h) | 6779 | static void controller_lockup_detected(struct ctlr_info *h) |
6744 | { | 6780 | { |
6745 | unsigned long flags; | 6781 | unsigned long flags; |
6782 | u32 lockup_detected; | ||
6746 | 6783 | ||
6747 | h->access.set_intr_mask(h, HPSA_INTR_OFF); | 6784 | h->access.set_intr_mask(h, HPSA_INTR_OFF); |
6748 | spin_lock_irqsave(&h->lock, flags); | 6785 | spin_lock_irqsave(&h->lock, flags); |
6749 | h->lockup_detected = readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); | 6786 | lockup_detected = readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); |
6787 | if (!lockup_detected) { | ||
6788 | /* no heartbeat, but controller gave us a zero. */ | ||
6789 | dev_warn(&h->pdev->dev, | ||
6790 | "lockup detected but scratchpad register is zero\n"); | ||
6791 | lockup_detected = 0xffffffff; | ||
6792 | } | ||
6793 | set_lockup_detected_for_all_cpus(h, lockup_detected); | ||
6750 | spin_unlock_irqrestore(&h->lock, flags); | 6794 | spin_unlock_irqrestore(&h->lock, flags); |
6751 | dev_warn(&h->pdev->dev, "Controller lockup detected: 0x%08x\n", | 6795 | dev_warn(&h->pdev->dev, "Controller lockup detected: 0x%08x\n", |
6752 | h->lockup_detected); | 6796 | lockup_detected); |
6753 | pci_disable_device(h->pdev); | 6797 | pci_disable_device(h->pdev); |
6754 | spin_lock_irqsave(&h->lock, flags); | 6798 | spin_lock_irqsave(&h->lock, flags); |
6755 | fail_all_cmds_on_list(h, &h->cmpQ); | 6799 | fail_all_cmds_on_list(h, &h->cmpQ); |
@@ -6884,7 +6928,7 @@ static void hpsa_monitor_ctlr_worker(struct work_struct *work) | |||
6884 | struct ctlr_info *h = container_of(to_delayed_work(work), | 6928 | struct ctlr_info *h = container_of(to_delayed_work(work), |
6885 | struct ctlr_info, monitor_ctlr_work); | 6929 | struct ctlr_info, monitor_ctlr_work); |
6886 | detect_controller_lockup(h); | 6930 | detect_controller_lockup(h); |
6887 | if (h->lockup_detected) | 6931 | if (lockup_detected(h)) |
6888 | return; | 6932 | return; |
6889 | 6933 | ||
6890 | if (hpsa_ctlr_needs_rescan(h) || hpsa_offline_devices_ready(h)) { | 6934 | if (hpsa_ctlr_needs_rescan(h) || hpsa_offline_devices_ready(h)) { |
@@ -6934,7 +6978,6 @@ reinit_after_soft_reset: | |||
6934 | * the 5 lower bits of the address are used by the hardware. and by | 6978 | * the 5 lower bits of the address are used by the hardware. and by |
6935 | * the driver. See comments in hpsa.h for more info. | 6979 | * the driver. See comments in hpsa.h for more info. |
6936 | */ | 6980 | */ |
6937 | #define COMMANDLIST_ALIGNMENT 128 | ||
6938 | BUILD_BUG_ON(sizeof(struct CommandList) % COMMANDLIST_ALIGNMENT); | 6981 | BUILD_BUG_ON(sizeof(struct CommandList) % COMMANDLIST_ALIGNMENT); |
6939 | h = kzalloc(sizeof(*h), GFP_KERNEL); | 6982 | h = kzalloc(sizeof(*h), GFP_KERNEL); |
6940 | if (!h) | 6983 | if (!h) |
@@ -6949,6 +6992,13 @@ reinit_after_soft_reset: | |||
6949 | spin_lock_init(&h->offline_device_lock); | 6992 | spin_lock_init(&h->offline_device_lock); |
6950 | spin_lock_init(&h->scan_lock); | 6993 | spin_lock_init(&h->scan_lock); |
6951 | spin_lock_init(&h->passthru_count_lock); | 6994 | spin_lock_init(&h->passthru_count_lock); |
6995 | |||
6996 | /* Allocate and clear per-cpu variable lockup_detected */ | ||
6997 | h->lockup_detected = alloc_percpu(u32); | ||
6998 | if (!h->lockup_detected) | ||
6999 | goto clean1; | ||
7000 | set_lockup_detected_for_all_cpus(h, 0); | ||
7001 | |||
6952 | rc = hpsa_pci_init(h); | 7002 | rc = hpsa_pci_init(h); |
6953 | if (rc != 0) | 7003 | if (rc != 0) |
6954 | goto clean1; | 7004 | goto clean1; |
@@ -7072,6 +7122,8 @@ clean4: | |||
7072 | free_irqs(h); | 7122 | free_irqs(h); |
7073 | clean2: | 7123 | clean2: |
7074 | clean1: | 7124 | clean1: |
7125 | if (h->lockup_detected) | ||
7126 | free_percpu(h->lockup_detected); | ||
7075 | kfree(h); | 7127 | kfree(h); |
7076 | return rc; | 7128 | return rc; |
7077 | } | 7129 | } |
@@ -7080,16 +7132,10 @@ static void hpsa_flush_cache(struct ctlr_info *h) | |||
7080 | { | 7132 | { |
7081 | char *flush_buf; | 7133 | char *flush_buf; |
7082 | struct CommandList *c; | 7134 | struct CommandList *c; |
7083 | unsigned long flags; | ||
7084 | 7135 | ||
7085 | /* Don't bother trying to flush the cache if locked up */ | 7136 | /* Don't bother trying to flush the cache if locked up */ |
7086 | spin_lock_irqsave(&h->lock, flags); | 7137 | if (unlikely(lockup_detected(h))) |
7087 | if (unlikely(h->lockup_detected)) { | ||
7088 | spin_unlock_irqrestore(&h->lock, flags); | ||
7089 | return; | 7138 | return; |
7090 | } | ||
7091 | spin_unlock_irqrestore(&h->lock, flags); | ||
7092 | |||
7093 | flush_buf = kzalloc(4, GFP_KERNEL); | 7139 | flush_buf = kzalloc(4, GFP_KERNEL); |
7094 | if (!flush_buf) | 7140 | if (!flush_buf) |
7095 | return; | 7141 | return; |
@@ -7165,8 +7211,7 @@ static void hpsa_remove_one(struct pci_dev *pdev) | |||
7165 | pci_free_consistent(h->pdev, | 7211 | pci_free_consistent(h->pdev, |
7166 | h->nr_cmds * sizeof(struct ErrorInfo), | 7212 | h->nr_cmds * sizeof(struct ErrorInfo), |
7167 | h->errinfo_pool, h->errinfo_pool_dhandle); | 7213 | h->errinfo_pool, h->errinfo_pool_dhandle); |
7168 | pci_free_consistent(h->pdev, h->reply_pool_size, | 7214 | hpsa_free_reply_queues(h); |
7169 | h->reply_pool, h->reply_pool_dhandle); | ||
7170 | kfree(h->cmd_pool_bits); | 7215 | kfree(h->cmd_pool_bits); |
7171 | kfree(h->blockFetchTable); | 7216 | kfree(h->blockFetchTable); |
7172 | kfree(h->ioaccel1_blockFetchTable); | 7217 | kfree(h->ioaccel1_blockFetchTable); |
@@ -7174,6 +7219,7 @@ static void hpsa_remove_one(struct pci_dev *pdev) | |||
7174 | kfree(h->hba_inquiry_data); | 7219 | kfree(h->hba_inquiry_data); |
7175 | pci_disable_device(pdev); | 7220 | pci_disable_device(pdev); |
7176 | pci_release_regions(pdev); | 7221 | pci_release_regions(pdev); |
7222 | free_percpu(h->lockup_detected); | ||
7177 | kfree(h); | 7223 | kfree(h); |
7178 | } | 7224 | } |
7179 | 7225 | ||
@@ -7278,8 +7324,16 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 trans_support) | |||
7278 | * 10 = 6 s/g entry or 24k | 7324 | * 10 = 6 s/g entry or 24k |
7279 | */ | 7325 | */ |
7280 | 7326 | ||
7327 | /* If the controller supports either ioaccel method then | ||
7328 | * we can also use the RAID stack submit path that does not | ||
7329 | * perform the superfluous readl() after each command submission. | ||
7330 | */ | ||
7331 | if (trans_support & (CFGTBL_Trans_io_accel1 | CFGTBL_Trans_io_accel2)) | ||
7332 | access = SA5_performant_access_no_read; | ||
7333 | |||
7281 | /* Controller spec: zero out this buffer. */ | 7334 | /* Controller spec: zero out this buffer. */ |
7282 | memset(h->reply_pool, 0, h->reply_pool_size); | 7335 | for (i = 0; i < h->nreply_queues; i++) |
7336 | memset(h->reply_queue[i].head, 0, h->reply_queue_size); | ||
7283 | 7337 | ||
7284 | bft[7] = SG_ENTRIES_IN_CMD + 4; | 7338 | bft[7] = SG_ENTRIES_IN_CMD + 4; |
7285 | calc_bucket_map(bft, ARRAY_SIZE(bft), | 7339 | calc_bucket_map(bft, ARRAY_SIZE(bft), |
@@ -7295,8 +7349,7 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 trans_support) | |||
7295 | 7349 | ||
7296 | for (i = 0; i < h->nreply_queues; i++) { | 7350 | for (i = 0; i < h->nreply_queues; i++) { |
7297 | writel(0, &h->transtable->RepQAddr[i].upper); | 7351 | writel(0, &h->transtable->RepQAddr[i].upper); |
7298 | writel(h->reply_pool_dhandle + | 7352 | writel(h->reply_queue[i].busaddr, |
7299 | (h->max_commands * sizeof(u64) * i), | ||
7300 | &h->transtable->RepQAddr[i].lower); | 7353 | &h->transtable->RepQAddr[i].lower); |
7301 | } | 7354 | } |
7302 | 7355 | ||
@@ -7344,8 +7397,10 @@ static void hpsa_enter_performant_mode(struct ctlr_info *h, u32 trans_support) | |||
7344 | h->ioaccel1_blockFetchTable); | 7397 | h->ioaccel1_blockFetchTable); |
7345 | 7398 | ||
7346 | /* initialize all reply queue entries to unused */ | 7399 | /* initialize all reply queue entries to unused */ |
7347 | memset(h->reply_pool, (u8) IOACCEL_MODE1_REPLY_UNUSED, | 7400 | for (i = 0; i < h->nreply_queues; i++) |
7348 | h->reply_pool_size); | 7401 | memset(h->reply_queue[i].head, |
7402 | (u8) IOACCEL_MODE1_REPLY_UNUSED, | ||
7403 | h->reply_queue_size); | ||
7349 | 7404 | ||
7350 | /* set all the constant fields in the accelerator command | 7405 | /* set all the constant fields in the accelerator command |
7351 | * frames once at init time to save CPU cycles later. | 7406 | * frames once at init time to save CPU cycles later. |
@@ -7407,7 +7462,6 @@ static int hpsa_alloc_ioaccel_cmd_and_bft(struct ctlr_info *h) | |||
7407 | * because the 7 lower bits of the address are used by the | 7462 | * because the 7 lower bits of the address are used by the |
7408 | * hardware. | 7463 | * hardware. |
7409 | */ | 7464 | */ |
7410 | #define IOACCEL1_COMMANDLIST_ALIGNMENT 128 | ||
7411 | BUILD_BUG_ON(sizeof(struct io_accel1_cmd) % | 7465 | BUILD_BUG_ON(sizeof(struct io_accel1_cmd) % |
7412 | IOACCEL1_COMMANDLIST_ALIGNMENT); | 7466 | IOACCEL1_COMMANDLIST_ALIGNMENT); |
7413 | h->ioaccel_cmd_pool = | 7467 | h->ioaccel_cmd_pool = |
@@ -7445,7 +7499,6 @@ static int ioaccel2_alloc_cmds_and_bft(struct ctlr_info *h) | |||
7445 | if (h->ioaccel_maxsg > IOACCEL2_MAXSGENTRIES) | 7499 | if (h->ioaccel_maxsg > IOACCEL2_MAXSGENTRIES) |
7446 | h->ioaccel_maxsg = IOACCEL2_MAXSGENTRIES; | 7500 | h->ioaccel_maxsg = IOACCEL2_MAXSGENTRIES; |
7447 | 7501 | ||
7448 | #define IOACCEL2_COMMANDLIST_ALIGNMENT 128 | ||
7449 | BUILD_BUG_ON(sizeof(struct io_accel2_cmd) % | 7502 | BUILD_BUG_ON(sizeof(struct io_accel2_cmd) % |
7450 | IOACCEL2_COMMANDLIST_ALIGNMENT); | 7503 | IOACCEL2_COMMANDLIST_ALIGNMENT); |
7451 | h->ioaccel2_cmd_pool = | 7504 | h->ioaccel2_cmd_pool = |
@@ -7503,16 +7556,17 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h) | |||
7503 | } | 7556 | } |
7504 | } | 7557 | } |
7505 | 7558 | ||
7506 | /* TODO, check that this next line h->nreply_queues is correct */ | ||
7507 | h->nreply_queues = h->msix_vector > 0 ? h->msix_vector : 1; | 7559 | h->nreply_queues = h->msix_vector > 0 ? h->msix_vector : 1; |
7508 | hpsa_get_max_perf_mode_cmds(h); | 7560 | hpsa_get_max_perf_mode_cmds(h); |
7509 | /* Performant mode ring buffer and supporting data structures */ | 7561 | /* Performant mode ring buffer and supporting data structures */ |
7510 | h->reply_pool_size = h->max_commands * sizeof(u64) * h->nreply_queues; | 7562 | h->reply_queue_size = h->max_commands * sizeof(u64); |
7511 | h->reply_pool = pci_alloc_consistent(h->pdev, h->reply_pool_size, | ||
7512 | &(h->reply_pool_dhandle)); | ||
7513 | 7563 | ||
7514 | for (i = 0; i < h->nreply_queues; i++) { | 7564 | for (i = 0; i < h->nreply_queues; i++) { |
7515 | h->reply_queue[i].head = &h->reply_pool[h->max_commands * i]; | 7565 | h->reply_queue[i].head = pci_alloc_consistent(h->pdev, |
7566 | h->reply_queue_size, | ||
7567 | &(h->reply_queue[i].busaddr)); | ||
7568 | if (!h->reply_queue[i].head) | ||
7569 | goto clean_up; | ||
7516 | h->reply_queue[i].size = h->max_commands; | 7570 | h->reply_queue[i].size = h->max_commands; |
7517 | h->reply_queue[i].wraparound = 1; /* spec: init to 1 */ | 7571 | h->reply_queue[i].wraparound = 1; /* spec: init to 1 */ |
7518 | h->reply_queue[i].current_entry = 0; | 7572 | h->reply_queue[i].current_entry = 0; |
@@ -7521,18 +7575,14 @@ static void hpsa_put_ctlr_into_performant_mode(struct ctlr_info *h) | |||
7521 | /* Need a block fetch table for performant mode */ | 7575 | /* Need a block fetch table for performant mode */ |
7522 | h->blockFetchTable = kmalloc(((SG_ENTRIES_IN_CMD + 1) * | 7576 | h->blockFetchTable = kmalloc(((SG_ENTRIES_IN_CMD + 1) * |
7523 | sizeof(u32)), GFP_KERNEL); | 7577 | sizeof(u32)), GFP_KERNEL); |
7524 | 7578 | if (!h->blockFetchTable) | |
7525 | if ((h->reply_pool == NULL) | ||
7526 | || (h->blockFetchTable == NULL)) | ||
7527 | goto clean_up; | 7579 | goto clean_up; |
7528 | 7580 | ||
7529 | hpsa_enter_performant_mode(h, trans_support); | 7581 | hpsa_enter_performant_mode(h, trans_support); |
7530 | return; | 7582 | return; |
7531 | 7583 | ||
7532 | clean_up: | 7584 | clean_up: |
7533 | if (h->reply_pool) | 7585 | hpsa_free_reply_queues(h); |
7534 | pci_free_consistent(h->pdev, h->reply_pool_size, | ||
7535 | h->reply_pool, h->reply_pool_dhandle); | ||
7536 | kfree(h->blockFetchTable); | 7586 | kfree(h->blockFetchTable); |
7537 | } | 7587 | } |
7538 | 7588 | ||
diff --git a/drivers/scsi/hpsa.h b/drivers/scsi/hpsa.h index 1e3cf33a82cf..24472cec7de3 100644 --- a/drivers/scsi/hpsa.h +++ b/drivers/scsi/hpsa.h | |||
@@ -57,11 +57,12 @@ struct hpsa_scsi_dev_t { | |||
57 | 57 | ||
58 | }; | 58 | }; |
59 | 59 | ||
60 | struct reply_pool { | 60 | struct reply_queue_buffer { |
61 | u64 *head; | 61 | u64 *head; |
62 | size_t size; | 62 | size_t size; |
63 | u8 wraparound; | 63 | u8 wraparound; |
64 | u32 current_entry; | 64 | u32 current_entry; |
65 | dma_addr_t busaddr; | ||
65 | }; | 66 | }; |
66 | 67 | ||
67 | #pragma pack(1) | 68 | #pragma pack(1) |
@@ -116,11 +117,8 @@ struct ctlr_info { | |||
116 | int nr_cmds; /* Number of commands allowed on this controller */ | 117 | int nr_cmds; /* Number of commands allowed on this controller */ |
117 | struct CfgTable __iomem *cfgtable; | 118 | struct CfgTable __iomem *cfgtable; |
118 | int interrupts_enabled; | 119 | int interrupts_enabled; |
119 | int major; | ||
120 | int max_commands; | 120 | int max_commands; |
121 | int commands_outstanding; | 121 | int commands_outstanding; |
122 | int max_outstanding; /* Debug */ | ||
123 | int usage_count; /* number of opens all all minor devices */ | ||
124 | # define PERF_MODE_INT 0 | 122 | # define PERF_MODE_INT 0 |
125 | # define DOORBELL_INT 1 | 123 | # define DOORBELL_INT 1 |
126 | # define SIMPLE_MODE_INT 2 | 124 | # define SIMPLE_MODE_INT 2 |
@@ -177,11 +175,9 @@ struct ctlr_info { | |||
177 | /* | 175 | /* |
178 | * Performant mode completion buffers | 176 | * Performant mode completion buffers |
179 | */ | 177 | */ |
180 | u64 *reply_pool; | 178 | size_t reply_queue_size; |
181 | size_t reply_pool_size; | 179 | struct reply_queue_buffer reply_queue[MAX_REPLY_QUEUES]; |
182 | struct reply_pool reply_queue[MAX_REPLY_QUEUES]; | ||
183 | u8 nreply_queues; | 180 | u8 nreply_queues; |
184 | dma_addr_t reply_pool_dhandle; | ||
185 | u32 *blockFetchTable; | 181 | u32 *blockFetchTable; |
186 | u32 *ioaccel1_blockFetchTable; | 182 | u32 *ioaccel1_blockFetchTable; |
187 | u32 *ioaccel2_blockFetchTable; | 183 | u32 *ioaccel2_blockFetchTable; |
@@ -196,7 +192,7 @@ struct ctlr_info { | |||
196 | u64 last_heartbeat_timestamp; | 192 | u64 last_heartbeat_timestamp; |
197 | u32 heartbeat_sample_interval; | 193 | u32 heartbeat_sample_interval; |
198 | atomic_t firmware_flash_in_progress; | 194 | atomic_t firmware_flash_in_progress; |
199 | u32 lockup_detected; | 195 | u32 *lockup_detected; |
200 | struct delayed_work monitor_ctlr_work; | 196 | struct delayed_work monitor_ctlr_work; |
201 | int remove_in_progress; | 197 | int remove_in_progress; |
202 | u32 fifo_recently_full; | 198 | u32 fifo_recently_full; |
@@ -233,11 +229,9 @@ struct ctlr_info { | |||
233 | #define CTLR_STATE_CHANGE_EVENT_AIO_CONFIG_CHANGE (1 << 31) | 229 | #define CTLR_STATE_CHANGE_EVENT_AIO_CONFIG_CHANGE (1 << 31) |
234 | 230 | ||
235 | #define RESCAN_REQUIRED_EVENT_BITS \ | 231 | #define RESCAN_REQUIRED_EVENT_BITS \ |
236 | (CTLR_STATE_CHANGE_EVENT | \ | 232 | (CTLR_ENCLOSURE_HOT_PLUG_EVENT | \ |
237 | CTLR_ENCLOSURE_HOT_PLUG_EVENT | \ | ||
238 | CTLR_STATE_CHANGE_EVENT_PHYSICAL_DRV | \ | 233 | CTLR_STATE_CHANGE_EVENT_PHYSICAL_DRV | \ |
239 | CTLR_STATE_CHANGE_EVENT_LOGICAL_DRV | \ | 234 | CTLR_STATE_CHANGE_EVENT_LOGICAL_DRV | \ |
240 | CTLR_STATE_CHANGE_EVENT_REDUNDANT_CNTRL | \ | ||
241 | CTLR_STATE_CHANGE_EVENT_AIO_ENABLED_DISABLED | \ | 235 | CTLR_STATE_CHANGE_EVENT_AIO_ENABLED_DISABLED | \ |
242 | CTLR_STATE_CHANGE_EVENT_AIO_CONFIG_CHANGE) | 236 | CTLR_STATE_CHANGE_EVENT_AIO_CONFIG_CHANGE) |
243 | spinlock_t offline_device_lock; | 237 | spinlock_t offline_device_lock; |
@@ -346,22 +340,23 @@ struct offline_device_entry { | |||
346 | static void SA5_submit_command(struct ctlr_info *h, | 340 | static void SA5_submit_command(struct ctlr_info *h, |
347 | struct CommandList *c) | 341 | struct CommandList *c) |
348 | { | 342 | { |
349 | dev_dbg(&h->pdev->dev, "Sending %x, tag = %x\n", c->busaddr, | ||
350 | c->Header.Tag.lower); | ||
351 | writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET); | 343 | writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET); |
352 | (void) readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); | 344 | (void) readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); |
353 | } | 345 | } |
354 | 346 | ||
347 | static void SA5_submit_command_no_read(struct ctlr_info *h, | ||
348 | struct CommandList *c) | ||
349 | { | ||
350 | writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET); | ||
351 | } | ||
352 | |||
355 | static void SA5_submit_command_ioaccel2(struct ctlr_info *h, | 353 | static void SA5_submit_command_ioaccel2(struct ctlr_info *h, |
356 | struct CommandList *c) | 354 | struct CommandList *c) |
357 | { | 355 | { |
358 | dev_dbg(&h->pdev->dev, "Sending %x, tag = %x\n", c->busaddr, | ||
359 | c->Header.Tag.lower); | ||
360 | if (c->cmd_type == CMD_IOACCEL2) | 356 | if (c->cmd_type == CMD_IOACCEL2) |
361 | writel(c->busaddr, h->vaddr + IOACCEL2_INBOUND_POSTQ_32); | 357 | writel(c->busaddr, h->vaddr + IOACCEL2_INBOUND_POSTQ_32); |
362 | else | 358 | else |
363 | writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET); | 359 | writel(c->busaddr, h->vaddr + SA5_REQUEST_PORT_OFFSET); |
364 | (void) readl(h->vaddr + SA5_SCRATCHPAD_OFFSET); | ||
365 | } | 360 | } |
366 | 361 | ||
367 | /* | 362 | /* |
@@ -399,7 +394,7 @@ static void SA5_performant_intr_mask(struct ctlr_info *h, unsigned long val) | |||
399 | 394 | ||
400 | static unsigned long SA5_performant_completed(struct ctlr_info *h, u8 q) | 395 | static unsigned long SA5_performant_completed(struct ctlr_info *h, u8 q) |
401 | { | 396 | { |
402 | struct reply_pool *rq = &h->reply_queue[q]; | 397 | struct reply_queue_buffer *rq = &h->reply_queue[q]; |
403 | unsigned long flags, register_value = FIFO_EMPTY; | 398 | unsigned long flags, register_value = FIFO_EMPTY; |
404 | 399 | ||
405 | /* msi auto clears the interrupt pending bit. */ | 400 | /* msi auto clears the interrupt pending bit. */ |
@@ -478,7 +473,6 @@ static bool SA5_intr_pending(struct ctlr_info *h) | |||
478 | { | 473 | { |
479 | unsigned long register_value = | 474 | unsigned long register_value = |
480 | readl(h->vaddr + SA5_INTR_STATUS); | 475 | readl(h->vaddr + SA5_INTR_STATUS); |
481 | dev_dbg(&h->pdev->dev, "intr_pending %lx\n", register_value); | ||
482 | return register_value & SA5_INTR_PENDING; | 476 | return register_value & SA5_INTR_PENDING; |
483 | } | 477 | } |
484 | 478 | ||
@@ -515,7 +509,7 @@ static bool SA5_ioaccel_mode1_intr_pending(struct ctlr_info *h) | |||
515 | static unsigned long SA5_ioaccel_mode1_completed(struct ctlr_info *h, u8 q) | 509 | static unsigned long SA5_ioaccel_mode1_completed(struct ctlr_info *h, u8 q) |
516 | { | 510 | { |
517 | u64 register_value; | 511 | u64 register_value; |
518 | struct reply_pool *rq = &h->reply_queue[q]; | 512 | struct reply_queue_buffer *rq = &h->reply_queue[q]; |
519 | unsigned long flags; | 513 | unsigned long flags; |
520 | 514 | ||
521 | BUG_ON(q >= h->nreply_queues); | 515 | BUG_ON(q >= h->nreply_queues); |
@@ -573,6 +567,14 @@ static struct access_method SA5_performant_access = { | |||
573 | SA5_performant_completed, | 567 | SA5_performant_completed, |
574 | }; | 568 | }; |
575 | 569 | ||
570 | static struct access_method SA5_performant_access_no_read = { | ||
571 | SA5_submit_command_no_read, | ||
572 | SA5_performant_intr_mask, | ||
573 | SA5_fifo_full, | ||
574 | SA5_performant_intr_pending, | ||
575 | SA5_performant_completed, | ||
576 | }; | ||
577 | |||
576 | struct board_type { | 578 | struct board_type { |
577 | u32 board_id; | 579 | u32 board_id; |
578 | char *product_name; | 580 | char *product_name; |
diff --git a/drivers/scsi/hpsa_cmd.h b/drivers/scsi/hpsa_cmd.h index b5cc7052339f..b5125dc31439 100644 --- a/drivers/scsi/hpsa_cmd.h +++ b/drivers/scsi/hpsa_cmd.h | |||
@@ -151,7 +151,7 @@ | |||
151 | #define HPSA_VPD_HEADER_SZ 4 | 151 | #define HPSA_VPD_HEADER_SZ 4 |
152 | 152 | ||
153 | /* Logical volume states */ | 153 | /* Logical volume states */ |
154 | #define HPSA_VPD_LV_STATUS_UNSUPPORTED -1 | 154 | #define HPSA_VPD_LV_STATUS_UNSUPPORTED 0xff |
155 | #define HPSA_LV_OK 0x0 | 155 | #define HPSA_LV_OK 0x0 |
156 | #define HPSA_LV_UNDERGOING_ERASE 0x0F | 156 | #define HPSA_LV_UNDERGOING_ERASE 0x0F |
157 | #define HPSA_LV_UNDERGOING_RPI 0x12 | 157 | #define HPSA_LV_UNDERGOING_RPI 0x12 |
@@ -238,11 +238,21 @@ struct ReportLUNdata { | |||
238 | u8 LUN[HPSA_MAX_LUN][8]; | 238 | u8 LUN[HPSA_MAX_LUN][8]; |
239 | }; | 239 | }; |
240 | 240 | ||
241 | struct ext_report_lun_entry { | ||
242 | u8 lunid[8]; | ||
243 | u8 wwid[8]; | ||
244 | u8 device_type; | ||
245 | u8 device_flags; | ||
246 | u8 lun_count; /* multi-lun device, how many luns */ | ||
247 | u8 redundant_paths; | ||
248 | u32 ioaccel_handle; /* ioaccel1 only uses lower 16 bits */ | ||
249 | }; | ||
250 | |||
241 | struct ReportExtendedLUNdata { | 251 | struct ReportExtendedLUNdata { |
242 | u8 LUNListLength[4]; | 252 | u8 LUNListLength[4]; |
243 | u8 extended_response_flag; | 253 | u8 extended_response_flag; |
244 | u8 reserved[3]; | 254 | u8 reserved[3]; |
245 | u8 LUN[HPSA_MAX_LUN][24]; | 255 | struct ext_report_lun_entry LUN[HPSA_MAX_LUN]; |
246 | }; | 256 | }; |
247 | 257 | ||
248 | struct SenseSubsystem_info { | 258 | struct SenseSubsystem_info { |
@@ -375,6 +385,7 @@ struct ctlr_info; /* defined in hpsa.h */ | |||
375 | * or a bus address. | 385 | * or a bus address. |
376 | */ | 386 | */ |
377 | 387 | ||
388 | #define COMMANDLIST_ALIGNMENT 128 | ||
378 | struct CommandList { | 389 | struct CommandList { |
379 | struct CommandListHeader Header; | 390 | struct CommandListHeader Header; |
380 | struct RequestBlock Request; | 391 | struct RequestBlock Request; |
@@ -389,21 +400,7 @@ struct CommandList { | |||
389 | struct list_head list; | 400 | struct list_head list; |
390 | struct completion *waiting; | 401 | struct completion *waiting; |
391 | void *scsi_cmd; | 402 | void *scsi_cmd; |
392 | 403 | } __aligned(COMMANDLIST_ALIGNMENT); | |
393 | /* on 64 bit architectures, to get this to be 32-byte-aligned | ||
394 | * it so happens we need PAD_64 bytes of padding, on 32 bit systems, | ||
395 | * we need PAD_32 bytes of padding (see below). This does that. | ||
396 | * If it happens that 64 bit and 32 bit systems need different | ||
397 | * padding, PAD_32 and PAD_64 can be set independently, and. | ||
398 | * the code below will do the right thing. | ||
399 | */ | ||
400 | #define IS_32_BIT ((8 - sizeof(long))/4) | ||
401 | #define IS_64_BIT (!IS_32_BIT) | ||
402 | #define PAD_32 (40) | ||
403 | #define PAD_64 (12) | ||
404 | #define COMMANDLIST_PAD (IS_32_BIT * PAD_32 + IS_64_BIT * PAD_64) | ||
405 | u8 pad[COMMANDLIST_PAD]; | ||
406 | }; | ||
407 | 404 | ||
408 | /* Max S/G elements in I/O accelerator command */ | 405 | /* Max S/G elements in I/O accelerator command */ |
409 | #define IOACCEL1_MAXSGENTRIES 24 | 406 | #define IOACCEL1_MAXSGENTRIES 24 |
@@ -413,6 +410,7 @@ struct CommandList { | |||
413 | * Structure for I/O accelerator (mode 1) commands. | 410 | * Structure for I/O accelerator (mode 1) commands. |
414 | * Note that this structure must be 128-byte aligned in size. | 411 | * Note that this structure must be 128-byte aligned in size. |
415 | */ | 412 | */ |
413 | #define IOACCEL1_COMMANDLIST_ALIGNMENT 128 | ||
416 | struct io_accel1_cmd { | 414 | struct io_accel1_cmd { |
417 | u16 dev_handle; /* 0x00 - 0x01 */ | 415 | u16 dev_handle; /* 0x00 - 0x01 */ |
418 | u8 reserved1; /* 0x02 */ | 416 | u8 reserved1; /* 0x02 */ |
@@ -440,12 +438,7 @@ struct io_accel1_cmd { | |||
440 | struct vals32 host_addr; /* 0x70 - 0x77 */ | 438 | struct vals32 host_addr; /* 0x70 - 0x77 */ |
441 | u8 CISS_LUN[8]; /* 0x78 - 0x7F */ | 439 | u8 CISS_LUN[8]; /* 0x78 - 0x7F */ |
442 | struct SGDescriptor SG[IOACCEL1_MAXSGENTRIES]; | 440 | struct SGDescriptor SG[IOACCEL1_MAXSGENTRIES]; |
443 | #define IOACCEL1_PAD_64 0 | 441 | } __aligned(IOACCEL1_COMMANDLIST_ALIGNMENT); |
444 | #define IOACCEL1_PAD_32 0 | ||
445 | #define IOACCEL1_PAD (IS_32_BIT * IOACCEL1_PAD_32 + \ | ||
446 | IS_64_BIT * IOACCEL1_PAD_64) | ||
447 | u8 pad[IOACCEL1_PAD]; | ||
448 | }; | ||
449 | 442 | ||
450 | #define IOACCEL1_FUNCTION_SCSIIO 0x00 | 443 | #define IOACCEL1_FUNCTION_SCSIIO 0x00 |
451 | #define IOACCEL1_SGLOFFSET 32 | 444 | #define IOACCEL1_SGLOFFSET 32 |
@@ -510,14 +503,11 @@ struct io_accel2_scsi_response { | |||
510 | u8 sense_data_buff[32]; /* sense/response data buffer */ | 503 | u8 sense_data_buff[32]; /* sense/response data buffer */ |
511 | }; | 504 | }; |
512 | 505 | ||
513 | #define IOACCEL2_64_PAD 76 | ||
514 | #define IOACCEL2_32_PAD 76 | ||
515 | #define IOACCEL2_PAD (IS_32_BIT * IOACCEL2_32_PAD + \ | ||
516 | IS_64_BIT * IOACCEL2_64_PAD) | ||
517 | /* | 506 | /* |
518 | * Structure for I/O accelerator (mode 2 or m2) commands. | 507 | * Structure for I/O accelerator (mode 2 or m2) commands. |
519 | * Note that this structure must be 128-byte aligned in size. | 508 | * Note that this structure must be 128-byte aligned in size. |
520 | */ | 509 | */ |
510 | #define IOACCEL2_COMMANDLIST_ALIGNMENT 128 | ||
521 | struct io_accel2_cmd { | 511 | struct io_accel2_cmd { |
522 | u8 IU_type; /* IU Type */ | 512 | u8 IU_type; /* IU Type */ |
523 | u8 direction; /* direction, memtype, and encryption */ | 513 | u8 direction; /* direction, memtype, and encryption */ |
@@ -544,8 +534,7 @@ struct io_accel2_cmd { | |||
544 | u32 tweak_upper; /* Encryption tweak, upper 4 bytes */ | 534 | u32 tweak_upper; /* Encryption tweak, upper 4 bytes */ |
545 | struct ioaccel2_sg_element sg[IOACCEL2_MAXSGENTRIES]; | 535 | struct ioaccel2_sg_element sg[IOACCEL2_MAXSGENTRIES]; |
546 | struct io_accel2_scsi_response error_data; | 536 | struct io_accel2_scsi_response error_data; |
547 | u8 pad[IOACCEL2_PAD]; | 537 | } __aligned(IOACCEL2_COMMANDLIST_ALIGNMENT); |
548 | }; | ||
549 | 538 | ||
550 | /* | 539 | /* |
551 | * defines for Mode 2 command struct | 540 | * defines for Mode 2 command struct |
@@ -636,7 +625,7 @@ struct TransTable_struct { | |||
636 | u32 RepQCount; | 625 | u32 RepQCount; |
637 | u32 RepQCtrAddrLow32; | 626 | u32 RepQCtrAddrLow32; |
638 | u32 RepQCtrAddrHigh32; | 627 | u32 RepQCtrAddrHigh32; |
639 | #define MAX_REPLY_QUEUES 8 | 628 | #define MAX_REPLY_QUEUES 64 |
640 | struct vals32 RepQAddr[MAX_REPLY_QUEUES]; | 629 | struct vals32 RepQAddr[MAX_REPLY_QUEUES]; |
641 | }; | 630 | }; |
642 | 631 | ||
diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h index 94a3cafe7197..434e9037908e 100644 --- a/drivers/scsi/lpfc/lpfc.h +++ b/drivers/scsi/lpfc/lpfc.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -640,6 +640,7 @@ struct lpfc_hba { | |||
640 | #define HBA_DEVLOSS_TMO 0x2000 /* HBA in devloss timeout */ | 640 | #define HBA_DEVLOSS_TMO 0x2000 /* HBA in devloss timeout */ |
641 | #define HBA_RRQ_ACTIVE 0x4000 /* process the rrq active list */ | 641 | #define HBA_RRQ_ACTIVE 0x4000 /* process the rrq active list */ |
642 | #define HBA_FCP_IOQ_FLUSH 0x8000 /* FCP I/O queues being flushed */ | 642 | #define HBA_FCP_IOQ_FLUSH 0x8000 /* FCP I/O queues being flushed */ |
643 | #define HBA_FW_DUMP_OP 0x10000 /* Skips fn reset before FW dump */ | ||
643 | uint32_t fcp_ring_in_use; /* When polling test if intr-hndlr active*/ | 644 | uint32_t fcp_ring_in_use; /* When polling test if intr-hndlr active*/ |
644 | struct lpfc_dmabuf slim2p; | 645 | struct lpfc_dmabuf slim2p; |
645 | 646 | ||
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index 8d5b6ceec9c9..1d7a5c34ee8c 100644 --- a/drivers/scsi/lpfc/lpfc_attr.c +++ b/drivers/scsi/lpfc/lpfc_attr.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -919,10 +919,15 @@ lpfc_sli4_pdev_reg_request(struct lpfc_hba *phba, uint32_t opcode) | |||
919 | phba->cfg_sriov_nr_virtfn = 0; | 919 | phba->cfg_sriov_nr_virtfn = 0; |
920 | } | 920 | } |
921 | 921 | ||
922 | if (opcode == LPFC_FW_DUMP) | ||
923 | phba->hba_flag |= HBA_FW_DUMP_OP; | ||
924 | |||
922 | status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE); | 925 | status = lpfc_do_offline(phba, LPFC_EVT_OFFLINE); |
923 | 926 | ||
924 | if (status != 0) | 927 | if (status != 0) { |
928 | phba->hba_flag &= ~HBA_FW_DUMP_OP; | ||
925 | return status; | 929 | return status; |
930 | } | ||
926 | 931 | ||
927 | /* wait for the device to be quiesced before firmware reset */ | 932 | /* wait for the device to be quiesced before firmware reset */ |
928 | msleep(100); | 933 | msleep(100); |
@@ -2364,7 +2369,7 @@ lpfc_oas_tgt_store(struct device *dev, struct device_attribute *attr, | |||
2364 | uint8_t wwpn[WWN_SZ]; | 2369 | uint8_t wwpn[WWN_SZ]; |
2365 | int rc; | 2370 | int rc; |
2366 | 2371 | ||
2367 | if (!phba->cfg_EnableXLane) | 2372 | if (!phba->cfg_fof) |
2368 | return -EPERM; | 2373 | return -EPERM; |
2369 | 2374 | ||
2370 | /* count may include a LF at end of string */ | 2375 | /* count may include a LF at end of string */ |
@@ -2432,7 +2437,7 @@ lpfc_oas_vpt_store(struct device *dev, struct device_attribute *attr, | |||
2432 | uint8_t wwpn[WWN_SZ]; | 2437 | uint8_t wwpn[WWN_SZ]; |
2433 | int rc; | 2438 | int rc; |
2434 | 2439 | ||
2435 | if (!phba->cfg_EnableXLane) | 2440 | if (!phba->cfg_fof) |
2436 | return -EPERM; | 2441 | return -EPERM; |
2437 | 2442 | ||
2438 | /* count may include a LF at end of string */ | 2443 | /* count may include a LF at end of string */ |
@@ -2499,7 +2504,7 @@ lpfc_oas_lun_state_store(struct device *dev, struct device_attribute *attr, | |||
2499 | struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; | 2504 | struct lpfc_hba *phba = ((struct lpfc_vport *)shost->hostdata)->phba; |
2500 | int val = 0; | 2505 | int val = 0; |
2501 | 2506 | ||
2502 | if (!phba->cfg_EnableXLane) | 2507 | if (!phba->cfg_fof) |
2503 | return -EPERM; | 2508 | return -EPERM; |
2504 | 2509 | ||
2505 | if (!isdigit(buf[0])) | 2510 | if (!isdigit(buf[0])) |
@@ -2565,7 +2570,7 @@ lpfc_oas_lun_state_set(struct lpfc_hba *phba, uint8_t vpt_wwpn[], | |||
2565 | 2570 | ||
2566 | int rc = 0; | 2571 | int rc = 0; |
2567 | 2572 | ||
2568 | if (!phba->cfg_EnableXLane) | 2573 | if (!phba->cfg_fof) |
2569 | return -EPERM; | 2574 | return -EPERM; |
2570 | 2575 | ||
2571 | if (oas_state) { | 2576 | if (oas_state) { |
@@ -2670,7 +2675,7 @@ lpfc_oas_lun_show(struct device *dev, struct device_attribute *attr, | |||
2670 | uint64_t oas_lun; | 2675 | uint64_t oas_lun; |
2671 | int len = 0; | 2676 | int len = 0; |
2672 | 2677 | ||
2673 | if (!phba->cfg_EnableXLane) | 2678 | if (!phba->cfg_fof) |
2674 | return -EPERM; | 2679 | return -EPERM; |
2675 | 2680 | ||
2676 | if (wwn_to_u64(phba->cfg_oas_vpt_wwpn) == 0) | 2681 | if (wwn_to_u64(phba->cfg_oas_vpt_wwpn) == 0) |
@@ -2716,7 +2721,7 @@ lpfc_oas_lun_store(struct device *dev, struct device_attribute *attr, | |||
2716 | uint64_t scsi_lun; | 2721 | uint64_t scsi_lun; |
2717 | ssize_t rc; | 2722 | ssize_t rc; |
2718 | 2723 | ||
2719 | if (!phba->cfg_EnableXLane) | 2724 | if (!phba->cfg_fof) |
2720 | return -EPERM; | 2725 | return -EPERM; |
2721 | 2726 | ||
2722 | if (wwn_to_u64(phba->cfg_oas_vpt_wwpn) == 0) | 2727 | if (wwn_to_u64(phba->cfg_oas_vpt_wwpn) == 0) |
@@ -4655,7 +4660,7 @@ LPFC_ATTR_R(EnableXLane, 0, 0, 1, "Enable Express Lane Feature."); | |||
4655 | # 0x0 - 0x7f = CS_CTL field in FC header (high 7 bits) | 4660 | # 0x0 - 0x7f = CS_CTL field in FC header (high 7 bits) |
4656 | # Value range is [0x0,0x7f]. Default value is 0 | 4661 | # Value range is [0x0,0x7f]. Default value is 0 |
4657 | */ | 4662 | */ |
4658 | LPFC_ATTR_R(XLanePriority, 0, 0x0, 0x7f, "CS_CTL for Express Lane Feature."); | 4663 | LPFC_ATTR_RW(XLanePriority, 0, 0x0, 0x7f, "CS_CTL for Express Lane Feature."); |
4659 | 4664 | ||
4660 | /* | 4665 | /* |
4661 | # lpfc_enable_bg: Enable BlockGuard (Emulex's Implementation of T10-DIF) | 4666 | # lpfc_enable_bg: Enable BlockGuard (Emulex's Implementation of T10-DIF) |
diff --git a/drivers/scsi/lpfc/lpfc_bsg.c b/drivers/scsi/lpfc/lpfc_bsg.c index ca2f4ea7cdef..5b5c825d9576 100644 --- a/drivers/scsi/lpfc/lpfc_bsg.c +++ b/drivers/scsi/lpfc/lpfc_bsg.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2009-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2009-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
diff --git a/drivers/scsi/lpfc/lpfc_bsg.h b/drivers/scsi/lpfc/lpfc_bsg.h index a94d4c9dfaa5..928ef609f363 100644 --- a/drivers/scsi/lpfc/lpfc_bsg.h +++ b/drivers/scsi/lpfc/lpfc_bsg.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2010-2012 Emulex. All rights reserved. * | 4 | * Copyright (C) 2010-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
diff --git a/drivers/scsi/lpfc/lpfc_crtn.h b/drivers/scsi/lpfc/lpfc_crtn.h index adda0bf7a244..db5604f01a1a 100644 --- a/drivers/scsi/lpfc/lpfc_crtn.h +++ b/drivers/scsi/lpfc/lpfc_crtn.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
@@ -289,6 +289,7 @@ int lpfc_sli_issue_iocb(struct lpfc_hba *, uint32_t, | |||
289 | void lpfc_sli_pcimem_bcopy(void *, void *, uint32_t); | 289 | void lpfc_sli_pcimem_bcopy(void *, void *, uint32_t); |
290 | void lpfc_sli_bemem_bcopy(void *, void *, uint32_t); | 290 | void lpfc_sli_bemem_bcopy(void *, void *, uint32_t); |
291 | void lpfc_sli_abort_iocb_ring(struct lpfc_hba *, struct lpfc_sli_ring *); | 291 | void lpfc_sli_abort_iocb_ring(struct lpfc_hba *, struct lpfc_sli_ring *); |
292 | void lpfc_sli_abort_fcp_rings(struct lpfc_hba *phba); | ||
292 | void lpfc_sli_hba_iocb_abort(struct lpfc_hba *); | 293 | void lpfc_sli_hba_iocb_abort(struct lpfc_hba *); |
293 | void lpfc_sli_flush_fcp_rings(struct lpfc_hba *); | 294 | void lpfc_sli_flush_fcp_rings(struct lpfc_hba *); |
294 | int lpfc_sli_ringpostbuf_put(struct lpfc_hba *, struct lpfc_sli_ring *, | 295 | int lpfc_sli_ringpostbuf_put(struct lpfc_hba *, struct lpfc_sli_ring *, |
@@ -310,6 +311,9 @@ int lpfc_sli_issue_abort_iotag(struct lpfc_hba *, struct lpfc_sli_ring *, | |||
310 | int lpfc_sli_sum_iocb(struct lpfc_vport *, uint16_t, uint64_t, lpfc_ctx_cmd); | 311 | int lpfc_sli_sum_iocb(struct lpfc_vport *, uint16_t, uint64_t, lpfc_ctx_cmd); |
311 | int lpfc_sli_abort_iocb(struct lpfc_vport *, struct lpfc_sli_ring *, uint16_t, | 312 | int lpfc_sli_abort_iocb(struct lpfc_vport *, struct lpfc_sli_ring *, uint16_t, |
312 | uint64_t, lpfc_ctx_cmd); | 313 | uint64_t, lpfc_ctx_cmd); |
314 | int | ||
315 | lpfc_sli_abort_taskmgmt(struct lpfc_vport *, struct lpfc_sli_ring *, | ||
316 | uint16_t, uint64_t, lpfc_ctx_cmd); | ||
313 | 317 | ||
314 | void lpfc_mbox_timeout(unsigned long); | 318 | void lpfc_mbox_timeout(unsigned long); |
315 | void lpfc_mbox_timeout_handler(struct lpfc_hba *); | 319 | void lpfc_mbox_timeout_handler(struct lpfc_hba *); |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index 828c08e9389e..b0aedce3f54b 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2007-2012 Emulex. All rights reserved. * | 4 | * Copyright (C) 2007-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
@@ -2314,7 +2314,7 @@ proc_cq: | |||
2314 | goto too_big; | 2314 | goto too_big; |
2315 | } | 2315 | } |
2316 | 2316 | ||
2317 | if (phba->cfg_EnableXLane) { | 2317 | if (phba->cfg_fof) { |
2318 | 2318 | ||
2319 | /* OAS CQ */ | 2319 | /* OAS CQ */ |
2320 | qp = phba->sli4_hba.oas_cq; | 2320 | qp = phba->sli4_hba.oas_cq; |
diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c index 624fe0b3cc0b..7a5d81a65be8 100644 --- a/drivers/scsi/lpfc/lpfc_els.c +++ b/drivers/scsi/lpfc/lpfc_els.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c index 294c072e9083..2a17e31265b8 100644 --- a/drivers/scsi/lpfc/lpfc_hbadisc.c +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -5634,6 +5634,9 @@ lpfc_nlp_init(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp, | |||
5634 | ndlp->active_rrqs_xri_bitmap = | 5634 | ndlp->active_rrqs_xri_bitmap = |
5635 | mempool_alloc(vport->phba->active_rrq_pool, | 5635 | mempool_alloc(vport->phba->active_rrq_pool, |
5636 | GFP_KERNEL); | 5636 | GFP_KERNEL); |
5637 | if (ndlp->active_rrqs_xri_bitmap) | ||
5638 | memset(ndlp->active_rrqs_xri_bitmap, 0, | ||
5639 | ndlp->phba->cfg_rrq_xri_bitmap_sz); | ||
5637 | } | 5640 | } |
5638 | 5641 | ||
5639 | 5642 | ||
diff --git a/drivers/scsi/lpfc/lpfc_hw.h b/drivers/scsi/lpfc/lpfc_hw.h index 3d9438ce59ab..236259252379 100644 --- a/drivers/scsi/lpfc/lpfc_hw.h +++ b/drivers/scsi/lpfc/lpfc_hw.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
diff --git a/drivers/scsi/lpfc/lpfc_hw4.h b/drivers/scsi/lpfc/lpfc_hw4.h index fd79f7de7666..f432ec180cf8 100644 --- a/drivers/scsi/lpfc/lpfc_hw4.h +++ b/drivers/scsi/lpfc/lpfc_hw4.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2009-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2009-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 635eeb3d6987..06f9a5b79e66 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -820,57 +820,153 @@ lpfc_hba_down_prep(struct lpfc_hba *phba) | |||
820 | } | 820 | } |
821 | 821 | ||
822 | /** | 822 | /** |
823 | * lpfc_hba_down_post_s3 - Perform lpfc uninitialization after HBA reset | 823 | * lpfc_sli4_free_sp_events - Cleanup sp_queue_events to free |
824 | * rspiocb which got deferred | ||
825 | * | ||
824 | * @phba: pointer to lpfc HBA data structure. | 826 | * @phba: pointer to lpfc HBA data structure. |
825 | * | 827 | * |
826 | * This routine will do uninitialization after the HBA is reset when bring | 828 | * This routine will cleanup completed slow path events after HBA is reset |
827 | * down the SLI Layer. | 829 | * when bringing down the SLI Layer. |
830 | * | ||
828 | * | 831 | * |
829 | * Return codes | 832 | * Return codes |
830 | * 0 - success. | 833 | * void. |
831 | * Any other value - error. | ||
832 | **/ | 834 | **/ |
833 | static int | 835 | static void |
834 | lpfc_hba_down_post_s3(struct lpfc_hba *phba) | 836 | lpfc_sli4_free_sp_events(struct lpfc_hba *phba) |
837 | { | ||
838 | struct lpfc_iocbq *rspiocbq; | ||
839 | struct hbq_dmabuf *dmabuf; | ||
840 | struct lpfc_cq_event *cq_event; | ||
841 | |||
842 | spin_lock_irq(&phba->hbalock); | ||
843 | phba->hba_flag &= ~HBA_SP_QUEUE_EVT; | ||
844 | spin_unlock_irq(&phba->hbalock); | ||
845 | |||
846 | while (!list_empty(&phba->sli4_hba.sp_queue_event)) { | ||
847 | /* Get the response iocb from the head of work queue */ | ||
848 | spin_lock_irq(&phba->hbalock); | ||
849 | list_remove_head(&phba->sli4_hba.sp_queue_event, | ||
850 | cq_event, struct lpfc_cq_event, list); | ||
851 | spin_unlock_irq(&phba->hbalock); | ||
852 | |||
853 | switch (bf_get(lpfc_wcqe_c_code, &cq_event->cqe.wcqe_cmpl)) { | ||
854 | case CQE_CODE_COMPL_WQE: | ||
855 | rspiocbq = container_of(cq_event, struct lpfc_iocbq, | ||
856 | cq_event); | ||
857 | lpfc_sli_release_iocbq(phba, rspiocbq); | ||
858 | break; | ||
859 | case CQE_CODE_RECEIVE: | ||
860 | case CQE_CODE_RECEIVE_V1: | ||
861 | dmabuf = container_of(cq_event, struct hbq_dmabuf, | ||
862 | cq_event); | ||
863 | lpfc_in_buf_free(phba, &dmabuf->dbuf); | ||
864 | } | ||
865 | } | ||
866 | } | ||
867 | |||
868 | /** | ||
869 | * lpfc_hba_free_post_buf - Perform lpfc uninitialization after HBA reset | ||
870 | * @phba: pointer to lpfc HBA data structure. | ||
871 | * | ||
872 | * This routine will cleanup posted ELS buffers after the HBA is reset | ||
873 | * when bringing down the SLI Layer. | ||
874 | * | ||
875 | * | ||
876 | * Return codes | ||
877 | * void. | ||
878 | **/ | ||
879 | static void | ||
880 | lpfc_hba_free_post_buf(struct lpfc_hba *phba) | ||
835 | { | 881 | { |
836 | struct lpfc_sli *psli = &phba->sli; | 882 | struct lpfc_sli *psli = &phba->sli; |
837 | struct lpfc_sli_ring *pring; | 883 | struct lpfc_sli_ring *pring; |
838 | struct lpfc_dmabuf *mp, *next_mp; | 884 | struct lpfc_dmabuf *mp, *next_mp; |
839 | LIST_HEAD(completions); | 885 | LIST_HEAD(buflist); |
840 | int i; | 886 | int count; |
841 | 887 | ||
842 | if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) | 888 | if (phba->sli3_options & LPFC_SLI3_HBQ_ENABLED) |
843 | lpfc_sli_hbqbuf_free_all(phba); | 889 | lpfc_sli_hbqbuf_free_all(phba); |
844 | else { | 890 | else { |
845 | /* Cleanup preposted buffers on the ELS ring */ | 891 | /* Cleanup preposted buffers on the ELS ring */ |
846 | pring = &psli->ring[LPFC_ELS_RING]; | 892 | pring = &psli->ring[LPFC_ELS_RING]; |
847 | list_for_each_entry_safe(mp, next_mp, &pring->postbufq, list) { | 893 | spin_lock_irq(&phba->hbalock); |
894 | list_splice_init(&pring->postbufq, &buflist); | ||
895 | spin_unlock_irq(&phba->hbalock); | ||
896 | |||
897 | count = 0; | ||
898 | list_for_each_entry_safe(mp, next_mp, &buflist, list) { | ||
848 | list_del(&mp->list); | 899 | list_del(&mp->list); |
849 | pring->postbufq_cnt--; | 900 | count++; |
850 | lpfc_mbuf_free(phba, mp->virt, mp->phys); | 901 | lpfc_mbuf_free(phba, mp->virt, mp->phys); |
851 | kfree(mp); | 902 | kfree(mp); |
852 | } | 903 | } |
904 | |||
905 | spin_lock_irq(&phba->hbalock); | ||
906 | pring->postbufq_cnt -= count; | ||
907 | spin_unlock_irq(&phba->hbalock); | ||
853 | } | 908 | } |
909 | } | ||
910 | |||
911 | /** | ||
912 | * lpfc_hba_clean_txcmplq - Perform lpfc uninitialization after HBA reset | ||
913 | * @phba: pointer to lpfc HBA data structure. | ||
914 | * | ||
915 | * This routine will cleanup the txcmplq after the HBA is reset when bringing | ||
916 | * down the SLI Layer. | ||
917 | * | ||
918 | * Return codes | ||
919 | * void | ||
920 | **/ | ||
921 | static void | ||
922 | lpfc_hba_clean_txcmplq(struct lpfc_hba *phba) | ||
923 | { | ||
924 | struct lpfc_sli *psli = &phba->sli; | ||
925 | struct lpfc_sli_ring *pring; | ||
926 | LIST_HEAD(completions); | ||
927 | int i; | ||
854 | 928 | ||
855 | spin_lock_irq(&phba->hbalock); | ||
856 | for (i = 0; i < psli->num_rings; i++) { | 929 | for (i = 0; i < psli->num_rings; i++) { |
857 | pring = &psli->ring[i]; | 930 | pring = &psli->ring[i]; |
858 | 931 | if (phba->sli_rev >= LPFC_SLI_REV4) | |
932 | spin_lock_irq(&pring->ring_lock); | ||
933 | else | ||
934 | spin_lock_irq(&phba->hbalock); | ||
859 | /* At this point in time the HBA is either reset or DOA. Either | 935 | /* At this point in time the HBA is either reset or DOA. Either |
860 | * way, nothing should be on txcmplq as it will NEVER complete. | 936 | * way, nothing should be on txcmplq as it will NEVER complete. |
861 | */ | 937 | */ |
862 | list_splice_init(&pring->txcmplq, &completions); | 938 | list_splice_init(&pring->txcmplq, &completions); |
863 | spin_unlock_irq(&phba->hbalock); | 939 | pring->txcmplq_cnt = 0; |
940 | |||
941 | if (phba->sli_rev >= LPFC_SLI_REV4) | ||
942 | spin_unlock_irq(&pring->ring_lock); | ||
943 | else | ||
944 | spin_unlock_irq(&phba->hbalock); | ||
864 | 945 | ||
865 | /* Cancel all the IOCBs from the completions list */ | 946 | /* Cancel all the IOCBs from the completions list */ |
866 | lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT, | 947 | lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT, |
867 | IOERR_SLI_ABORTED); | 948 | IOERR_SLI_ABORTED); |
868 | |||
869 | lpfc_sli_abort_iocb_ring(phba, pring); | 949 | lpfc_sli_abort_iocb_ring(phba, pring); |
870 | spin_lock_irq(&phba->hbalock); | ||
871 | } | 950 | } |
872 | spin_unlock_irq(&phba->hbalock); | 951 | } |
873 | 952 | ||
953 | /** | ||
954 | * lpfc_hba_down_post_s3 - Perform lpfc uninitialization after HBA reset | ||
955 | int i; | ||
956 | * @phba: pointer to lpfc HBA data structure. | ||
957 | * | ||
958 | * This routine will do uninitialization after the HBA is reset when bring | ||
959 | * down the SLI Layer. | ||
960 | * | ||
961 | * Return codes | ||
962 | * 0 - success. | ||
963 | * Any other value - error. | ||
964 | **/ | ||
965 | static int | ||
966 | lpfc_hba_down_post_s3(struct lpfc_hba *phba) | ||
967 | { | ||
968 | lpfc_hba_free_post_buf(phba); | ||
969 | lpfc_hba_clean_txcmplq(phba); | ||
874 | return 0; | 970 | return 0; |
875 | } | 971 | } |
876 | 972 | ||
@@ -890,13 +986,12 @@ lpfc_hba_down_post_s4(struct lpfc_hba *phba) | |||
890 | { | 986 | { |
891 | struct lpfc_scsi_buf *psb, *psb_next; | 987 | struct lpfc_scsi_buf *psb, *psb_next; |
892 | LIST_HEAD(aborts); | 988 | LIST_HEAD(aborts); |
893 | int ret; | ||
894 | unsigned long iflag = 0; | 989 | unsigned long iflag = 0; |
895 | struct lpfc_sglq *sglq_entry = NULL; | 990 | struct lpfc_sglq *sglq_entry = NULL; |
896 | 991 | ||
897 | ret = lpfc_hba_down_post_s3(phba); | 992 | lpfc_hba_free_post_buf(phba); |
898 | if (ret) | 993 | lpfc_hba_clean_txcmplq(phba); |
899 | return ret; | 994 | |
900 | /* At this point in time the HBA is either reset or DOA. Either | 995 | /* At this point in time the HBA is either reset or DOA. Either |
901 | * way, nothing should be on lpfc_abts_els_sgl_list, it needs to be | 996 | * way, nothing should be on lpfc_abts_els_sgl_list, it needs to be |
902 | * on the lpfc_sgl_list so that it can either be freed if the | 997 | * on the lpfc_sgl_list so that it can either be freed if the |
@@ -932,6 +1027,8 @@ lpfc_hba_down_post_s4(struct lpfc_hba *phba) | |||
932 | spin_lock_irqsave(&phba->scsi_buf_list_put_lock, iflag); | 1027 | spin_lock_irqsave(&phba->scsi_buf_list_put_lock, iflag); |
933 | list_splice(&aborts, &phba->lpfc_scsi_buf_list_put); | 1028 | list_splice(&aborts, &phba->lpfc_scsi_buf_list_put); |
934 | spin_unlock_irqrestore(&phba->scsi_buf_list_put_lock, iflag); | 1029 | spin_unlock_irqrestore(&phba->scsi_buf_list_put_lock, iflag); |
1030 | |||
1031 | lpfc_sli4_free_sp_events(phba); | ||
935 | return 0; | 1032 | return 0; |
936 | } | 1033 | } |
937 | 1034 | ||
@@ -1250,7 +1347,6 @@ static void | |||
1250 | lpfc_handle_deferred_eratt(struct lpfc_hba *phba) | 1347 | lpfc_handle_deferred_eratt(struct lpfc_hba *phba) |
1251 | { | 1348 | { |
1252 | uint32_t old_host_status = phba->work_hs; | 1349 | uint32_t old_host_status = phba->work_hs; |
1253 | struct lpfc_sli_ring *pring; | ||
1254 | struct lpfc_sli *psli = &phba->sli; | 1350 | struct lpfc_sli *psli = &phba->sli; |
1255 | 1351 | ||
1256 | /* If the pci channel is offline, ignore possible errors, | 1352 | /* If the pci channel is offline, ignore possible errors, |
@@ -1279,8 +1375,7 @@ lpfc_handle_deferred_eratt(struct lpfc_hba *phba) | |||
1279 | * dropped by the firmware. Error iocb (I/O) on txcmplq and let the | 1375 | * dropped by the firmware. Error iocb (I/O) on txcmplq and let the |
1280 | * SCSI layer retry it after re-establishing link. | 1376 | * SCSI layer retry it after re-establishing link. |
1281 | */ | 1377 | */ |
1282 | pring = &psli->ring[psli->fcp_ring]; | 1378 | lpfc_sli_abort_fcp_rings(phba); |
1283 | lpfc_sli_abort_iocb_ring(phba, pring); | ||
1284 | 1379 | ||
1285 | /* | 1380 | /* |
1286 | * There was a firmware error. Take the hba offline and then | 1381 | * There was a firmware error. Take the hba offline and then |
@@ -1348,7 +1443,6 @@ lpfc_handle_eratt_s3(struct lpfc_hba *phba) | |||
1348 | { | 1443 | { |
1349 | struct lpfc_vport *vport = phba->pport; | 1444 | struct lpfc_vport *vport = phba->pport; |
1350 | struct lpfc_sli *psli = &phba->sli; | 1445 | struct lpfc_sli *psli = &phba->sli; |
1351 | struct lpfc_sli_ring *pring; | ||
1352 | uint32_t event_data; | 1446 | uint32_t event_data; |
1353 | unsigned long temperature; | 1447 | unsigned long temperature; |
1354 | struct temp_event temp_event_data; | 1448 | struct temp_event temp_event_data; |
@@ -1400,8 +1494,7 @@ lpfc_handle_eratt_s3(struct lpfc_hba *phba) | |||
1400 | * Error iocb (I/O) on txcmplq and let the SCSI layer | 1494 | * Error iocb (I/O) on txcmplq and let the SCSI layer |
1401 | * retry it after re-establishing link. | 1495 | * retry it after re-establishing link. |
1402 | */ | 1496 | */ |
1403 | pring = &psli->ring[psli->fcp_ring]; | 1497 | lpfc_sli_abort_fcp_rings(phba); |
1404 | lpfc_sli_abort_iocb_ring(phba, pring); | ||
1405 | 1498 | ||
1406 | /* | 1499 | /* |
1407 | * There was a firmware error. Take the hba offline and then | 1500 | * There was a firmware error. Take the hba offline and then |
@@ -1940,78 +2033,81 @@ lpfc_get_hba_model_desc(struct lpfc_hba *phba, uint8_t *mdp, uint8_t *descp) | |||
1940 | 2033 | ||
1941 | switch (dev_id) { | 2034 | switch (dev_id) { |
1942 | case PCI_DEVICE_ID_FIREFLY: | 2035 | case PCI_DEVICE_ID_FIREFLY: |
1943 | m = (typeof(m)){"LP6000", "PCI", "Fibre Channel Adapter"}; | 2036 | m = (typeof(m)){"LP6000", "PCI", |
2037 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
1944 | break; | 2038 | break; |
1945 | case PCI_DEVICE_ID_SUPERFLY: | 2039 | case PCI_DEVICE_ID_SUPERFLY: |
1946 | if (vp->rev.biuRev >= 1 && vp->rev.biuRev <= 3) | 2040 | if (vp->rev.biuRev >= 1 && vp->rev.biuRev <= 3) |
1947 | m = (typeof(m)){"LP7000", "PCI", | 2041 | m = (typeof(m)){"LP7000", "PCI", ""}; |
1948 | "Fibre Channel Adapter"}; | ||
1949 | else | 2042 | else |
1950 | m = (typeof(m)){"LP7000E", "PCI", | 2043 | m = (typeof(m)){"LP7000E", "PCI", ""}; |
1951 | "Fibre Channel Adapter"}; | 2044 | m.function = "Obsolete, Unsupported Fibre Channel Adapter"; |
1952 | break; | 2045 | break; |
1953 | case PCI_DEVICE_ID_DRAGONFLY: | 2046 | case PCI_DEVICE_ID_DRAGONFLY: |
1954 | m = (typeof(m)){"LP8000", "PCI", | 2047 | m = (typeof(m)){"LP8000", "PCI", |
1955 | "Fibre Channel Adapter"}; | 2048 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
1956 | break; | 2049 | break; |
1957 | case PCI_DEVICE_ID_CENTAUR: | 2050 | case PCI_DEVICE_ID_CENTAUR: |
1958 | if (FC_JEDEC_ID(vp->rev.biuRev) == CENTAUR_2G_JEDEC_ID) | 2051 | if (FC_JEDEC_ID(vp->rev.biuRev) == CENTAUR_2G_JEDEC_ID) |
1959 | m = (typeof(m)){"LP9002", "PCI", | 2052 | m = (typeof(m)){"LP9002", "PCI", ""}; |
1960 | "Fibre Channel Adapter"}; | ||
1961 | else | 2053 | else |
1962 | m = (typeof(m)){"LP9000", "PCI", | 2054 | m = (typeof(m)){"LP9000", "PCI", ""}; |
1963 | "Fibre Channel Adapter"}; | 2055 | m.function = "Obsolete, Unsupported Fibre Channel Adapter"; |
1964 | break; | 2056 | break; |
1965 | case PCI_DEVICE_ID_RFLY: | 2057 | case PCI_DEVICE_ID_RFLY: |
1966 | m = (typeof(m)){"LP952", "PCI", | 2058 | m = (typeof(m)){"LP952", "PCI", |
1967 | "Fibre Channel Adapter"}; | 2059 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
1968 | break; | 2060 | break; |
1969 | case PCI_DEVICE_ID_PEGASUS: | 2061 | case PCI_DEVICE_ID_PEGASUS: |
1970 | m = (typeof(m)){"LP9802", "PCI-X", | 2062 | m = (typeof(m)){"LP9802", "PCI-X", |
1971 | "Fibre Channel Adapter"}; | 2063 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
1972 | break; | 2064 | break; |
1973 | case PCI_DEVICE_ID_THOR: | 2065 | case PCI_DEVICE_ID_THOR: |
1974 | m = (typeof(m)){"LP10000", "PCI-X", | 2066 | m = (typeof(m)){"LP10000", "PCI-X", |
1975 | "Fibre Channel Adapter"}; | 2067 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
1976 | break; | 2068 | break; |
1977 | case PCI_DEVICE_ID_VIPER: | 2069 | case PCI_DEVICE_ID_VIPER: |
1978 | m = (typeof(m)){"LPX1000", "PCI-X", | 2070 | m = (typeof(m)){"LPX1000", "PCI-X", |
1979 | "Fibre Channel Adapter"}; | 2071 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
1980 | break; | 2072 | break; |
1981 | case PCI_DEVICE_ID_PFLY: | 2073 | case PCI_DEVICE_ID_PFLY: |
1982 | m = (typeof(m)){"LP982", "PCI-X", | 2074 | m = (typeof(m)){"LP982", "PCI-X", |
1983 | "Fibre Channel Adapter"}; | 2075 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
1984 | break; | 2076 | break; |
1985 | case PCI_DEVICE_ID_TFLY: | 2077 | case PCI_DEVICE_ID_TFLY: |
1986 | m = (typeof(m)){"LP1050", "PCI-X", | 2078 | m = (typeof(m)){"LP1050", "PCI-X", |
1987 | "Fibre Channel Adapter"}; | 2079 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
1988 | break; | 2080 | break; |
1989 | case PCI_DEVICE_ID_HELIOS: | 2081 | case PCI_DEVICE_ID_HELIOS: |
1990 | m = (typeof(m)){"LP11000", "PCI-X2", | 2082 | m = (typeof(m)){"LP11000", "PCI-X2", |
1991 | "Fibre Channel Adapter"}; | 2083 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
1992 | break; | 2084 | break; |
1993 | case PCI_DEVICE_ID_HELIOS_SCSP: | 2085 | case PCI_DEVICE_ID_HELIOS_SCSP: |
1994 | m = (typeof(m)){"LP11000-SP", "PCI-X2", | 2086 | m = (typeof(m)){"LP11000-SP", "PCI-X2", |
1995 | "Fibre Channel Adapter"}; | 2087 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
1996 | break; | 2088 | break; |
1997 | case PCI_DEVICE_ID_HELIOS_DCSP: | 2089 | case PCI_DEVICE_ID_HELIOS_DCSP: |
1998 | m = (typeof(m)){"LP11002-SP", "PCI-X2", | 2090 | m = (typeof(m)){"LP11002-SP", "PCI-X2", |
1999 | "Fibre Channel Adapter"}; | 2091 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
2000 | break; | 2092 | break; |
2001 | case PCI_DEVICE_ID_NEPTUNE: | 2093 | case PCI_DEVICE_ID_NEPTUNE: |
2002 | m = (typeof(m)){"LPe1000", "PCIe", "Fibre Channel Adapter"}; | 2094 | m = (typeof(m)){"LPe1000", "PCIe", |
2095 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
2003 | break; | 2096 | break; |
2004 | case PCI_DEVICE_ID_NEPTUNE_SCSP: | 2097 | case PCI_DEVICE_ID_NEPTUNE_SCSP: |
2005 | m = (typeof(m)){"LPe1000-SP", "PCIe", "Fibre Channel Adapter"}; | 2098 | m = (typeof(m)){"LPe1000-SP", "PCIe", |
2099 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
2006 | break; | 2100 | break; |
2007 | case PCI_DEVICE_ID_NEPTUNE_DCSP: | 2101 | case PCI_DEVICE_ID_NEPTUNE_DCSP: |
2008 | m = (typeof(m)){"LPe1002-SP", "PCIe", "Fibre Channel Adapter"}; | 2102 | m = (typeof(m)){"LPe1002-SP", "PCIe", |
2103 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
2009 | break; | 2104 | break; |
2010 | case PCI_DEVICE_ID_BMID: | 2105 | case PCI_DEVICE_ID_BMID: |
2011 | m = (typeof(m)){"LP1150", "PCI-X2", "Fibre Channel Adapter"}; | 2106 | m = (typeof(m)){"LP1150", "PCI-X2", "Fibre Channel Adapter"}; |
2012 | break; | 2107 | break; |
2013 | case PCI_DEVICE_ID_BSMB: | 2108 | case PCI_DEVICE_ID_BSMB: |
2014 | m = (typeof(m)){"LP111", "PCI-X2", "Fibre Channel Adapter"}; | 2109 | m = (typeof(m)){"LP111", "PCI-X2", |
2110 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
2015 | break; | 2111 | break; |
2016 | case PCI_DEVICE_ID_ZEPHYR: | 2112 | case PCI_DEVICE_ID_ZEPHYR: |
2017 | m = (typeof(m)){"LPe11000", "PCIe", "Fibre Channel Adapter"}; | 2113 | m = (typeof(m)){"LPe11000", "PCIe", "Fibre Channel Adapter"}; |
@@ -2030,16 +2126,20 @@ lpfc_get_hba_model_desc(struct lpfc_hba *phba, uint8_t *mdp, uint8_t *descp) | |||
2030 | m = (typeof(m)){"LPe111", "PCIe", "Fibre Channel Adapter"}; | 2126 | m = (typeof(m)){"LPe111", "PCIe", "Fibre Channel Adapter"}; |
2031 | break; | 2127 | break; |
2032 | case PCI_DEVICE_ID_LP101: | 2128 | case PCI_DEVICE_ID_LP101: |
2033 | m = (typeof(m)){"LP101", "PCI-X", "Fibre Channel Adapter"}; | 2129 | m = (typeof(m)){"LP101", "PCI-X", |
2130 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
2034 | break; | 2131 | break; |
2035 | case PCI_DEVICE_ID_LP10000S: | 2132 | case PCI_DEVICE_ID_LP10000S: |
2036 | m = (typeof(m)){"LP10000-S", "PCI", "Fibre Channel Adapter"}; | 2133 | m = (typeof(m)){"LP10000-S", "PCI", |
2134 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
2037 | break; | 2135 | break; |
2038 | case PCI_DEVICE_ID_LP11000S: | 2136 | case PCI_DEVICE_ID_LP11000S: |
2039 | m = (typeof(m)){"LP11000-S", "PCI-X2", "Fibre Channel Adapter"}; | 2137 | m = (typeof(m)){"LP11000-S", "PCI-X2", |
2138 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
2040 | break; | 2139 | break; |
2041 | case PCI_DEVICE_ID_LPE11000S: | 2140 | case PCI_DEVICE_ID_LPE11000S: |
2042 | m = (typeof(m)){"LPe11000-S", "PCIe", "Fibre Channel Adapter"}; | 2141 | m = (typeof(m)){"LPe11000-S", "PCIe", |
2142 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
2043 | break; | 2143 | break; |
2044 | case PCI_DEVICE_ID_SAT: | 2144 | case PCI_DEVICE_ID_SAT: |
2045 | m = (typeof(m)){"LPe12000", "PCIe", "Fibre Channel Adapter"}; | 2145 | m = (typeof(m)){"LPe12000", "PCIe", "Fibre Channel Adapter"}; |
@@ -2060,20 +2160,21 @@ lpfc_get_hba_model_desc(struct lpfc_hba *phba, uint8_t *mdp, uint8_t *descp) | |||
2060 | m = (typeof(m)){"LPe12000-S", "PCIe", "Fibre Channel Adapter"}; | 2160 | m = (typeof(m)){"LPe12000-S", "PCIe", "Fibre Channel Adapter"}; |
2061 | break; | 2161 | break; |
2062 | case PCI_DEVICE_ID_HORNET: | 2162 | case PCI_DEVICE_ID_HORNET: |
2063 | m = (typeof(m)){"LP21000", "PCIe", "FCoE Adapter"}; | 2163 | m = (typeof(m)){"LP21000", "PCIe", |
2164 | "Obsolete, Unsupported FCoE Adapter"}; | ||
2064 | GE = 1; | 2165 | GE = 1; |
2065 | break; | 2166 | break; |
2066 | case PCI_DEVICE_ID_PROTEUS_VF: | 2167 | case PCI_DEVICE_ID_PROTEUS_VF: |
2067 | m = (typeof(m)){"LPev12000", "PCIe IOV", | 2168 | m = (typeof(m)){"LPev12000", "PCIe IOV", |
2068 | "Fibre Channel Adapter"}; | 2169 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
2069 | break; | 2170 | break; |
2070 | case PCI_DEVICE_ID_PROTEUS_PF: | 2171 | case PCI_DEVICE_ID_PROTEUS_PF: |
2071 | m = (typeof(m)){"LPev12000", "PCIe IOV", | 2172 | m = (typeof(m)){"LPev12000", "PCIe IOV", |
2072 | "Fibre Channel Adapter"}; | 2173 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
2073 | break; | 2174 | break; |
2074 | case PCI_DEVICE_ID_PROTEUS_S: | 2175 | case PCI_DEVICE_ID_PROTEUS_S: |
2075 | m = (typeof(m)){"LPemv12002-S", "PCIe IOV", | 2176 | m = (typeof(m)){"LPemv12002-S", "PCIe IOV", |
2076 | "Fibre Channel Adapter"}; | 2177 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
2077 | break; | 2178 | break; |
2078 | case PCI_DEVICE_ID_TIGERSHARK: | 2179 | case PCI_DEVICE_ID_TIGERSHARK: |
2079 | oneConnect = 1; | 2180 | oneConnect = 1; |
@@ -2089,17 +2190,24 @@ lpfc_get_hba_model_desc(struct lpfc_hba *phba, uint8_t *mdp, uint8_t *descp) | |||
2089 | break; | 2190 | break; |
2090 | case PCI_DEVICE_ID_BALIUS: | 2191 | case PCI_DEVICE_ID_BALIUS: |
2091 | m = (typeof(m)){"LPVe12002", "PCIe Shared I/O", | 2192 | m = (typeof(m)){"LPVe12002", "PCIe Shared I/O", |
2092 | "Fibre Channel Adapter"}; | 2193 | "Obsolete, Unsupported Fibre Channel Adapter"}; |
2093 | break; | 2194 | break; |
2094 | case PCI_DEVICE_ID_LANCER_FC: | 2195 | case PCI_DEVICE_ID_LANCER_FC: |
2095 | case PCI_DEVICE_ID_LANCER_FC_VF: | ||
2096 | m = (typeof(m)){"LPe16000", "PCIe", "Fibre Channel Adapter"}; | 2196 | m = (typeof(m)){"LPe16000", "PCIe", "Fibre Channel Adapter"}; |
2097 | break; | 2197 | break; |
2198 | case PCI_DEVICE_ID_LANCER_FC_VF: | ||
2199 | m = (typeof(m)){"LPe16000", "PCIe", | ||
2200 | "Obsolete, Unsupported Fibre Channel Adapter"}; | ||
2201 | break; | ||
2098 | case PCI_DEVICE_ID_LANCER_FCOE: | 2202 | case PCI_DEVICE_ID_LANCER_FCOE: |
2099 | case PCI_DEVICE_ID_LANCER_FCOE_VF: | ||
2100 | oneConnect = 1; | 2203 | oneConnect = 1; |
2101 | m = (typeof(m)){"OCe15100", "PCIe", "FCoE"}; | 2204 | m = (typeof(m)){"OCe15100", "PCIe", "FCoE"}; |
2102 | break; | 2205 | break; |
2206 | case PCI_DEVICE_ID_LANCER_FCOE_VF: | ||
2207 | oneConnect = 1; | ||
2208 | m = (typeof(m)){"OCe15100", "PCIe", | ||
2209 | "Obsolete, Unsupported FCoE"}; | ||
2210 | break; | ||
2103 | case PCI_DEVICE_ID_SKYHAWK: | 2211 | case PCI_DEVICE_ID_SKYHAWK: |
2104 | case PCI_DEVICE_ID_SKYHAWK_VF: | 2212 | case PCI_DEVICE_ID_SKYHAWK_VF: |
2105 | oneConnect = 1; | 2213 | oneConnect = 1; |
@@ -4614,7 +4722,10 @@ lpfc_reset_hba(struct lpfc_hba *phba) | |||
4614 | phba->link_state = LPFC_HBA_ERROR; | 4722 | phba->link_state = LPFC_HBA_ERROR; |
4615 | return; | 4723 | return; |
4616 | } | 4724 | } |
4617 | lpfc_offline_prep(phba, LPFC_MBX_WAIT); | 4725 | if (phba->sli.sli_flag & LPFC_SLI_ACTIVE) |
4726 | lpfc_offline_prep(phba, LPFC_MBX_WAIT); | ||
4727 | else | ||
4728 | lpfc_offline_prep(phba, LPFC_MBX_NO_WAIT); | ||
4618 | lpfc_offline(phba); | 4729 | lpfc_offline(phba); |
4619 | lpfc_sli_brdrestart(phba); | 4730 | lpfc_sli_brdrestart(phba); |
4620 | lpfc_online(phba); | 4731 | lpfc_online(phba); |
@@ -9663,9 +9774,6 @@ lpfc_pci_resume_one_s3(struct pci_dev *pdev) | |||
9663 | static void | 9774 | static void |
9664 | lpfc_sli_prep_dev_for_recover(struct lpfc_hba *phba) | 9775 | lpfc_sli_prep_dev_for_recover(struct lpfc_hba *phba) |
9665 | { | 9776 | { |
9666 | struct lpfc_sli *psli = &phba->sli; | ||
9667 | struct lpfc_sli_ring *pring; | ||
9668 | |||
9669 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 9777 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
9670 | "2723 PCI channel I/O abort preparing for recovery\n"); | 9778 | "2723 PCI channel I/O abort preparing for recovery\n"); |
9671 | 9779 | ||
@@ -9673,8 +9781,7 @@ lpfc_sli_prep_dev_for_recover(struct lpfc_hba *phba) | |||
9673 | * There may be errored I/Os through HBA, abort all I/Os on txcmplq | 9781 | * There may be errored I/Os through HBA, abort all I/Os on txcmplq |
9674 | * and let the SCSI mid-layer to retry them to recover. | 9782 | * and let the SCSI mid-layer to retry them to recover. |
9675 | */ | 9783 | */ |
9676 | pring = &psli->ring[psli->fcp_ring]; | 9784 | lpfc_sli_abort_fcp_rings(phba); |
9677 | lpfc_sli_abort_iocb_ring(phba, pring); | ||
9678 | } | 9785 | } |
9679 | 9786 | ||
9680 | /** | 9787 | /** |
@@ -10417,17 +10524,13 @@ lpfc_pci_resume_one_s4(struct pci_dev *pdev) | |||
10417 | static void | 10524 | static void |
10418 | lpfc_sli4_prep_dev_for_recover(struct lpfc_hba *phba) | 10525 | lpfc_sli4_prep_dev_for_recover(struct lpfc_hba *phba) |
10419 | { | 10526 | { |
10420 | struct lpfc_sli *psli = &phba->sli; | ||
10421 | struct lpfc_sli_ring *pring; | ||
10422 | |||
10423 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 10527 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
10424 | "2828 PCI channel I/O abort preparing for recovery\n"); | 10528 | "2828 PCI channel I/O abort preparing for recovery\n"); |
10425 | /* | 10529 | /* |
10426 | * There may be errored I/Os through HBA, abort all I/Os on txcmplq | 10530 | * There may be errored I/Os through HBA, abort all I/Os on txcmplq |
10427 | * and let the SCSI mid-layer to retry them to recover. | 10531 | * and let the SCSI mid-layer to retry them to recover. |
10428 | */ | 10532 | */ |
10429 | pring = &psli->ring[psli->fcp_ring]; | 10533 | lpfc_sli_abort_fcp_rings(phba); |
10430 | lpfc_sli_abort_iocb_ring(phba, pring); | ||
10431 | } | 10534 | } |
10432 | 10535 | ||
10433 | /** | 10536 | /** |
@@ -10898,7 +11001,7 @@ lpfc_sli4_oas_verify(struct lpfc_hba *phba) | |||
10898 | if (phba->sli4_hba.pc_sli4_params.oas_supported) { | 11001 | if (phba->sli4_hba.pc_sli4_params.oas_supported) { |
10899 | phba->cfg_fof = 1; | 11002 | phba->cfg_fof = 1; |
10900 | } else { | 11003 | } else { |
10901 | phba->cfg_EnableXLane = 0; | 11004 | phba->cfg_fof = 0; |
10902 | if (phba->device_data_mem_pool) | 11005 | if (phba->device_data_mem_pool) |
10903 | mempool_destroy(phba->device_data_mem_pool); | 11006 | mempool_destroy(phba->device_data_mem_pool); |
10904 | phba->device_data_mem_pool = NULL; | 11007 | phba->device_data_mem_pool = NULL; |
@@ -10928,7 +11031,7 @@ lpfc_fof_queue_setup(struct lpfc_hba *phba) | |||
10928 | if (rc) | 11031 | if (rc) |
10929 | return -ENOMEM; | 11032 | return -ENOMEM; |
10930 | 11033 | ||
10931 | if (phba->cfg_EnableXLane) { | 11034 | if (phba->cfg_fof) { |
10932 | 11035 | ||
10933 | rc = lpfc_cq_create(phba, phba->sli4_hba.oas_cq, | 11036 | rc = lpfc_cq_create(phba, phba->sli4_hba.oas_cq, |
10934 | phba->sli4_hba.fof_eq, LPFC_WCQ, LPFC_FCP); | 11037 | phba->sli4_hba.fof_eq, LPFC_WCQ, LPFC_FCP); |
@@ -10947,8 +11050,7 @@ lpfc_fof_queue_setup(struct lpfc_hba *phba) | |||
10947 | return 0; | 11050 | return 0; |
10948 | 11051 | ||
10949 | out_oas_wq: | 11052 | out_oas_wq: |
10950 | if (phba->cfg_EnableXLane) | 11053 | lpfc_cq_destroy(phba, phba->sli4_hba.oas_cq); |
10951 | lpfc_cq_destroy(phba, phba->sli4_hba.oas_cq); | ||
10952 | out_oas_cq: | 11054 | out_oas_cq: |
10953 | lpfc_eq_destroy(phba, phba->sli4_hba.fof_eq); | 11055 | lpfc_eq_destroy(phba, phba->sli4_hba.fof_eq); |
10954 | return rc; | 11056 | return rc; |
@@ -10982,7 +11084,7 @@ lpfc_fof_queue_create(struct lpfc_hba *phba) | |||
10982 | 11084 | ||
10983 | phba->sli4_hba.fof_eq = qdesc; | 11085 | phba->sli4_hba.fof_eq = qdesc; |
10984 | 11086 | ||
10985 | if (phba->cfg_EnableXLane) { | 11087 | if (phba->cfg_fof) { |
10986 | 11088 | ||
10987 | /* Create OAS CQ */ | 11089 | /* Create OAS CQ */ |
10988 | qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.cq_esize, | 11090 | qdesc = lpfc_sli4_queue_alloc(phba, phba->sli4_hba.cq_esize, |
diff --git a/drivers/scsi/lpfc/lpfc_mem.c b/drivers/scsi/lpfc/lpfc_mem.c index ed419aad2b1f..3fa65338d3f5 100644 --- a/drivers/scsi/lpfc/lpfc_mem.c +++ b/drivers/scsi/lpfc/lpfc_mem.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2012 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c index 462453ee0bda..2df11daad85b 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.c +++ b/drivers/scsi/lpfc/lpfc_scsi.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -73,7 +73,7 @@ lpfc_rport_data_from_scsi_device(struct scsi_device *sdev) | |||
73 | { | 73 | { |
74 | struct lpfc_vport *vport = (struct lpfc_vport *)sdev->host->hostdata; | 74 | struct lpfc_vport *vport = (struct lpfc_vport *)sdev->host->hostdata; |
75 | 75 | ||
76 | if (vport->phba->cfg_EnableXLane) | 76 | if (vport->phba->cfg_fof) |
77 | return ((struct lpfc_device_data *)sdev->hostdata)->rport_data; | 77 | return ((struct lpfc_device_data *)sdev->hostdata)->rport_data; |
78 | else | 78 | else |
79 | return (struct lpfc_rport_data *)sdev->hostdata; | 79 | return (struct lpfc_rport_data *)sdev->hostdata; |
@@ -3462,7 +3462,7 @@ lpfc_scsi_prep_dma_buf_s4(struct lpfc_hba *phba, struct lpfc_scsi_buf *lpfc_cmd) | |||
3462 | * If the OAS driver feature is enabled and the lun is enabled for | 3462 | * If the OAS driver feature is enabled and the lun is enabled for |
3463 | * OAS, set the oas iocb related flags. | 3463 | * OAS, set the oas iocb related flags. |
3464 | */ | 3464 | */ |
3465 | if ((phba->cfg_EnableXLane) && ((struct lpfc_device_data *) | 3465 | if ((phba->cfg_fof) && ((struct lpfc_device_data *) |
3466 | scsi_cmnd->device->hostdata)->oas_enabled) | 3466 | scsi_cmnd->device->hostdata)->oas_enabled) |
3467 | lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_OAS; | 3467 | lpfc_cmd->cur_iocbq.iocb_flag |= LPFC_IO_OAS; |
3468 | return 0; | 3468 | return 0; |
@@ -4314,6 +4314,7 @@ lpfc_scsi_prep_cmnd(struct lpfc_vport *vport, struct lpfc_scsi_buf *lpfc_cmd, | |||
4314 | fcp_cmnd->fcpCntl1 = SIMPLE_Q; | 4314 | fcp_cmnd->fcpCntl1 = SIMPLE_Q; |
4315 | 4315 | ||
4316 | sli4 = (phba->sli_rev == LPFC_SLI_REV4); | 4316 | sli4 = (phba->sli_rev == LPFC_SLI_REV4); |
4317 | piocbq->iocb.un.fcpi.fcpi_XRdy = 0; | ||
4317 | 4318 | ||
4318 | /* | 4319 | /* |
4319 | * There are three possibilities here - use scatter-gather segment, use | 4320 | * There are three possibilities here - use scatter-gather segment, use |
@@ -4782,7 +4783,9 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) | |||
4782 | struct lpfc_scsi_buf *lpfc_cmd; | 4783 | struct lpfc_scsi_buf *lpfc_cmd; |
4783 | IOCB_t *cmd, *icmd; | 4784 | IOCB_t *cmd, *icmd; |
4784 | int ret = SUCCESS, status = 0; | 4785 | int ret = SUCCESS, status = 0; |
4785 | unsigned long flags; | 4786 | struct lpfc_sli_ring *pring_s4; |
4787 | int ring_number, ret_val; | ||
4788 | unsigned long flags, iflags; | ||
4786 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waitq); | 4789 | DECLARE_WAIT_QUEUE_HEAD_ONSTACK(waitq); |
4787 | 4790 | ||
4788 | status = fc_block_scsi_eh(cmnd); | 4791 | status = fc_block_scsi_eh(cmnd); |
@@ -4833,6 +4836,14 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) | |||
4833 | 4836 | ||
4834 | BUG_ON(iocb->context1 != lpfc_cmd); | 4837 | BUG_ON(iocb->context1 != lpfc_cmd); |
4835 | 4838 | ||
4839 | /* abort issued in recovery is still in progress */ | ||
4840 | if (iocb->iocb_flag & LPFC_DRIVER_ABORTED) { | ||
4841 | lpfc_printf_vlog(vport, KERN_WARNING, LOG_FCP, | ||
4842 | "3389 SCSI Layer I/O Abort Request is pending\n"); | ||
4843 | spin_unlock_irqrestore(&phba->hbalock, flags); | ||
4844 | goto wait_for_cmpl; | ||
4845 | } | ||
4846 | |||
4836 | abtsiocb = __lpfc_sli_get_iocbq(phba); | 4847 | abtsiocb = __lpfc_sli_get_iocbq(phba); |
4837 | if (abtsiocb == NULL) { | 4848 | if (abtsiocb == NULL) { |
4838 | ret = FAILED; | 4849 | ret = FAILED; |
@@ -4871,11 +4882,23 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) | |||
4871 | 4882 | ||
4872 | abtsiocb->iocb_cmpl = lpfc_sli_abort_fcp_cmpl; | 4883 | abtsiocb->iocb_cmpl = lpfc_sli_abort_fcp_cmpl; |
4873 | abtsiocb->vport = vport; | 4884 | abtsiocb->vport = vport; |
4885 | if (phba->sli_rev == LPFC_SLI_REV4) { | ||
4886 | ring_number = MAX_SLI3_CONFIGURED_RINGS + iocb->fcp_wqidx; | ||
4887 | pring_s4 = &phba->sli.ring[ring_number]; | ||
4888 | /* Note: both hbalock and ring_lock must be set here */ | ||
4889 | spin_lock_irqsave(&pring_s4->ring_lock, iflags); | ||
4890 | ret_val = __lpfc_sli_issue_iocb(phba, pring_s4->ringno, | ||
4891 | abtsiocb, 0); | ||
4892 | spin_unlock_irqrestore(&pring_s4->ring_lock, iflags); | ||
4893 | } else { | ||
4894 | ret_val = __lpfc_sli_issue_iocb(phba, LPFC_FCP_RING, | ||
4895 | abtsiocb, 0); | ||
4896 | } | ||
4874 | /* no longer need the lock after this point */ | 4897 | /* no longer need the lock after this point */ |
4875 | spin_unlock_irqrestore(&phba->hbalock, flags); | 4898 | spin_unlock_irqrestore(&phba->hbalock, flags); |
4876 | 4899 | ||
4877 | if (lpfc_sli_issue_iocb(phba, LPFC_FCP_RING, abtsiocb, 0) == | 4900 | |
4878 | IOCB_ERROR) { | 4901 | if (ret_val == IOCB_ERROR) { |
4879 | lpfc_sli_release_iocbq(phba, abtsiocb); | 4902 | lpfc_sli_release_iocbq(phba, abtsiocb); |
4880 | ret = FAILED; | 4903 | ret = FAILED; |
4881 | goto out; | 4904 | goto out; |
@@ -4885,12 +4908,16 @@ lpfc_abort_handler(struct scsi_cmnd *cmnd) | |||
4885 | lpfc_sli_handle_fast_ring_event(phba, | 4908 | lpfc_sli_handle_fast_ring_event(phba, |
4886 | &phba->sli.ring[LPFC_FCP_RING], HA_R0RE_REQ); | 4909 | &phba->sli.ring[LPFC_FCP_RING], HA_R0RE_REQ); |
4887 | 4910 | ||
4911 | wait_for_cmpl: | ||
4888 | lpfc_cmd->waitq = &waitq; | 4912 | lpfc_cmd->waitq = &waitq; |
4889 | /* Wait for abort to complete */ | 4913 | /* Wait for abort to complete */ |
4890 | wait_event_timeout(waitq, | 4914 | wait_event_timeout(waitq, |
4891 | (lpfc_cmd->pCmd != cmnd), | 4915 | (lpfc_cmd->pCmd != cmnd), |
4892 | msecs_to_jiffies(2*vport->cfg_devloss_tmo*1000)); | 4916 | msecs_to_jiffies(2*vport->cfg_devloss_tmo*1000)); |
4917 | |||
4918 | spin_lock_irqsave(shost->host_lock, flags); | ||
4893 | lpfc_cmd->waitq = NULL; | 4919 | lpfc_cmd->waitq = NULL; |
4920 | spin_unlock_irqrestore(shost->host_lock, flags); | ||
4894 | 4921 | ||
4895 | if (lpfc_cmd->pCmd == cmnd) { | 4922 | if (lpfc_cmd->pCmd == cmnd) { |
4896 | ret = FAILED; | 4923 | ret = FAILED; |
@@ -5172,8 +5199,9 @@ lpfc_reset_flush_io_context(struct lpfc_vport *vport, uint16_t tgt_id, | |||
5172 | 5199 | ||
5173 | cnt = lpfc_sli_sum_iocb(vport, tgt_id, lun_id, context); | 5200 | cnt = lpfc_sli_sum_iocb(vport, tgt_id, lun_id, context); |
5174 | if (cnt) | 5201 | if (cnt) |
5175 | lpfc_sli_abort_iocb(vport, &phba->sli.ring[phba->sli.fcp_ring], | 5202 | lpfc_sli_abort_taskmgmt(vport, |
5176 | tgt_id, lun_id, context); | 5203 | &phba->sli.ring[phba->sli.fcp_ring], |
5204 | tgt_id, lun_id, context); | ||
5177 | later = msecs_to_jiffies(2 * vport->cfg_devloss_tmo * 1000) + jiffies; | 5205 | later = msecs_to_jiffies(2 * vport->cfg_devloss_tmo * 1000) + jiffies; |
5178 | while (time_after(later, jiffies) && cnt) { | 5206 | while (time_after(later, jiffies) && cnt) { |
5179 | schedule_timeout_uninterruptible(msecs_to_jiffies(20)); | 5207 | schedule_timeout_uninterruptible(msecs_to_jiffies(20)); |
@@ -5491,7 +5519,7 @@ lpfc_slave_alloc(struct scsi_device *sdev) | |||
5491 | if (!rport || fc_remote_port_chkready(rport)) | 5519 | if (!rport || fc_remote_port_chkready(rport)) |
5492 | return -ENXIO; | 5520 | return -ENXIO; |
5493 | 5521 | ||
5494 | if (phba->cfg_EnableXLane) { | 5522 | if (phba->cfg_fof) { |
5495 | 5523 | ||
5496 | /* | 5524 | /* |
5497 | * Check to see if the device data structure for the lun | 5525 | * Check to see if the device data structure for the lun |
@@ -5616,7 +5644,7 @@ lpfc_slave_destroy(struct scsi_device *sdev) | |||
5616 | struct lpfc_device_data *device_data = sdev->hostdata; | 5644 | struct lpfc_device_data *device_data = sdev->hostdata; |
5617 | 5645 | ||
5618 | atomic_dec(&phba->sdev_cnt); | 5646 | atomic_dec(&phba->sdev_cnt); |
5619 | if ((phba->cfg_EnableXLane) && (device_data)) { | 5647 | if ((phba->cfg_fof) && (device_data)) { |
5620 | spin_lock_irqsave(&phba->devicelock, flags); | 5648 | spin_lock_irqsave(&phba->devicelock, flags); |
5621 | device_data->available = false; | 5649 | device_data->available = false; |
5622 | if (!device_data->oas_enabled) | 5650 | if (!device_data->oas_enabled) |
@@ -5655,7 +5683,7 @@ lpfc_create_device_data(struct lpfc_hba *phba, struct lpfc_name *vport_wwpn, | |||
5655 | int memory_flags; | 5683 | int memory_flags; |
5656 | 5684 | ||
5657 | if (unlikely(!phba) || !vport_wwpn || !target_wwpn || | 5685 | if (unlikely(!phba) || !vport_wwpn || !target_wwpn || |
5658 | !(phba->cfg_EnableXLane)) | 5686 | !(phba->cfg_fof)) |
5659 | return NULL; | 5687 | return NULL; |
5660 | 5688 | ||
5661 | /* Attempt to create the device data to contain lun info */ | 5689 | /* Attempt to create the device data to contain lun info */ |
@@ -5693,7 +5721,7 @@ lpfc_delete_device_data(struct lpfc_hba *phba, | |||
5693 | { | 5721 | { |
5694 | 5722 | ||
5695 | if (unlikely(!phba) || !lun_info || | 5723 | if (unlikely(!phba) || !lun_info || |
5696 | !(phba->cfg_EnableXLane)) | 5724 | !(phba->cfg_fof)) |
5697 | return; | 5725 | return; |
5698 | 5726 | ||
5699 | if (!list_empty(&lun_info->listentry)) | 5727 | if (!list_empty(&lun_info->listentry)) |
@@ -5727,7 +5755,7 @@ __lpfc_get_device_data(struct lpfc_hba *phba, struct list_head *list, | |||
5727 | struct lpfc_device_data *lun_info; | 5755 | struct lpfc_device_data *lun_info; |
5728 | 5756 | ||
5729 | if (unlikely(!phba) || !list || !vport_wwpn || !target_wwpn || | 5757 | if (unlikely(!phba) || !list || !vport_wwpn || !target_wwpn || |
5730 | !phba->cfg_EnableXLane) | 5758 | !phba->cfg_fof) |
5731 | return NULL; | 5759 | return NULL; |
5732 | 5760 | ||
5733 | /* Check to see if the lun is already enabled for OAS. */ | 5761 | /* Check to see if the lun is already enabled for OAS. */ |
@@ -5789,7 +5817,7 @@ lpfc_find_next_oas_lun(struct lpfc_hba *phba, struct lpfc_name *vport_wwpn, | |||
5789 | !starting_lun || !found_vport_wwpn || | 5817 | !starting_lun || !found_vport_wwpn || |
5790 | !found_target_wwpn || !found_lun || !found_lun_status || | 5818 | !found_target_wwpn || !found_lun || !found_lun_status || |
5791 | (*starting_lun == NO_MORE_OAS_LUN) || | 5819 | (*starting_lun == NO_MORE_OAS_LUN) || |
5792 | !phba->cfg_EnableXLane) | 5820 | !phba->cfg_fof) |
5793 | return false; | 5821 | return false; |
5794 | 5822 | ||
5795 | lun = *starting_lun; | 5823 | lun = *starting_lun; |
@@ -5873,7 +5901,7 @@ lpfc_enable_oas_lun(struct lpfc_hba *phba, struct lpfc_name *vport_wwpn, | |||
5873 | unsigned long flags; | 5901 | unsigned long flags; |
5874 | 5902 | ||
5875 | if (unlikely(!phba) || !vport_wwpn || !target_wwpn || | 5903 | if (unlikely(!phba) || !vport_wwpn || !target_wwpn || |
5876 | !phba->cfg_EnableXLane) | 5904 | !phba->cfg_fof) |
5877 | return false; | 5905 | return false; |
5878 | 5906 | ||
5879 | spin_lock_irqsave(&phba->devicelock, flags); | 5907 | spin_lock_irqsave(&phba->devicelock, flags); |
@@ -5930,7 +5958,7 @@ lpfc_disable_oas_lun(struct lpfc_hba *phba, struct lpfc_name *vport_wwpn, | |||
5930 | unsigned long flags; | 5958 | unsigned long flags; |
5931 | 5959 | ||
5932 | if (unlikely(!phba) || !vport_wwpn || !target_wwpn || | 5960 | if (unlikely(!phba) || !vport_wwpn || !target_wwpn || |
5933 | !phba->cfg_EnableXLane) | 5961 | !phba->cfg_fof) |
5934 | return false; | 5962 | return false; |
5935 | 5963 | ||
5936 | spin_lock_irqsave(&phba->devicelock, flags); | 5964 | spin_lock_irqsave(&phba->devicelock, flags); |
diff --git a/drivers/scsi/lpfc/lpfc_scsi.h b/drivers/scsi/lpfc/lpfc_scsi.h index 0120bfccf50b..0389ac1e7b83 100644 --- a/drivers/scsi/lpfc/lpfc_scsi.h +++ b/drivers/scsi/lpfc/lpfc_scsi.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 393662c24df5..32ada0505576 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * | 7 | * Portions Copyright (C) 2004-2005 Christoph Hellwig * |
@@ -3532,14 +3532,27 @@ lpfc_sli_abort_iocb_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | |||
3532 | /* Error everything on txq and txcmplq | 3532 | /* Error everything on txq and txcmplq |
3533 | * First do the txq. | 3533 | * First do the txq. |
3534 | */ | 3534 | */ |
3535 | spin_lock_irq(&phba->hbalock); | 3535 | if (phba->sli_rev >= LPFC_SLI_REV4) { |
3536 | list_splice_init(&pring->txq, &completions); | 3536 | spin_lock_irq(&pring->ring_lock); |
3537 | list_splice_init(&pring->txq, &completions); | ||
3538 | pring->txq_cnt = 0; | ||
3539 | spin_unlock_irq(&pring->ring_lock); | ||
3537 | 3540 | ||
3538 | /* Next issue ABTS for everything on the txcmplq */ | 3541 | spin_lock_irq(&phba->hbalock); |
3539 | list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) | 3542 | /* Next issue ABTS for everything on the txcmplq */ |
3540 | lpfc_sli_issue_abort_iotag(phba, pring, iocb); | 3543 | list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) |
3544 | lpfc_sli_issue_abort_iotag(phba, pring, iocb); | ||
3545 | spin_unlock_irq(&phba->hbalock); | ||
3546 | } else { | ||
3547 | spin_lock_irq(&phba->hbalock); | ||
3548 | list_splice_init(&pring->txq, &completions); | ||
3549 | pring->txq_cnt = 0; | ||
3541 | 3550 | ||
3542 | spin_unlock_irq(&phba->hbalock); | 3551 | /* Next issue ABTS for everything on the txcmplq */ |
3552 | list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) | ||
3553 | lpfc_sli_issue_abort_iotag(phba, pring, iocb); | ||
3554 | spin_unlock_irq(&phba->hbalock); | ||
3555 | } | ||
3543 | 3556 | ||
3544 | /* Cancel all the IOCBs from the completions list */ | 3557 | /* Cancel all the IOCBs from the completions list */ |
3545 | lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT, | 3558 | lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT, |
@@ -3547,6 +3560,36 @@ lpfc_sli_abort_iocb_ring(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | |||
3547 | } | 3560 | } |
3548 | 3561 | ||
3549 | /** | 3562 | /** |
3563 | * lpfc_sli_abort_fcp_rings - Abort all iocbs in all FCP rings | ||
3564 | * @phba: Pointer to HBA context object. | ||
3565 | * @pring: Pointer to driver SLI ring object. | ||
3566 | * | ||
3567 | * This function aborts all iocbs in FCP rings and frees all the iocb | ||
3568 | * objects in txq. This function issues an abort iocb for all the iocb commands | ||
3569 | * in txcmplq. The iocbs in the txcmplq is not guaranteed to complete before | ||
3570 | * the return of this function. The caller is not required to hold any locks. | ||
3571 | **/ | ||
3572 | void | ||
3573 | lpfc_sli_abort_fcp_rings(struct lpfc_hba *phba) | ||
3574 | { | ||
3575 | struct lpfc_sli *psli = &phba->sli; | ||
3576 | struct lpfc_sli_ring *pring; | ||
3577 | uint32_t i; | ||
3578 | |||
3579 | /* Look on all the FCP Rings for the iotag */ | ||
3580 | if (phba->sli_rev >= LPFC_SLI_REV4) { | ||
3581 | for (i = 0; i < phba->cfg_fcp_io_channel; i++) { | ||
3582 | pring = &psli->ring[i + MAX_SLI3_CONFIGURED_RINGS]; | ||
3583 | lpfc_sli_abort_iocb_ring(phba, pring); | ||
3584 | } | ||
3585 | } else { | ||
3586 | pring = &psli->ring[psli->fcp_ring]; | ||
3587 | lpfc_sli_abort_iocb_ring(phba, pring); | ||
3588 | } | ||
3589 | } | ||
3590 | |||
3591 | |||
3592 | /** | ||
3550 | * lpfc_sli_flush_fcp_rings - flush all iocbs in the fcp ring | 3593 | * lpfc_sli_flush_fcp_rings - flush all iocbs in the fcp ring |
3551 | * @phba: Pointer to HBA context object. | 3594 | * @phba: Pointer to HBA context object. |
3552 | * | 3595 | * |
@@ -3563,28 +3606,55 @@ lpfc_sli_flush_fcp_rings(struct lpfc_hba *phba) | |||
3563 | LIST_HEAD(txcmplq); | 3606 | LIST_HEAD(txcmplq); |
3564 | struct lpfc_sli *psli = &phba->sli; | 3607 | struct lpfc_sli *psli = &phba->sli; |
3565 | struct lpfc_sli_ring *pring; | 3608 | struct lpfc_sli_ring *pring; |
3566 | 3609 | uint32_t i; | |
3567 | /* Currently, only one fcp ring */ | ||
3568 | pring = &psli->ring[psli->fcp_ring]; | ||
3569 | 3610 | ||
3570 | spin_lock_irq(&phba->hbalock); | 3611 | spin_lock_irq(&phba->hbalock); |
3571 | /* Retrieve everything on txq */ | ||
3572 | list_splice_init(&pring->txq, &txq); | ||
3573 | |||
3574 | /* Retrieve everything on the txcmplq */ | ||
3575 | list_splice_init(&pring->txcmplq, &txcmplq); | ||
3576 | |||
3577 | /* Indicate the I/O queues are flushed */ | 3612 | /* Indicate the I/O queues are flushed */ |
3578 | phba->hba_flag |= HBA_FCP_IOQ_FLUSH; | 3613 | phba->hba_flag |= HBA_FCP_IOQ_FLUSH; |
3579 | spin_unlock_irq(&phba->hbalock); | 3614 | spin_unlock_irq(&phba->hbalock); |
3580 | 3615 | ||
3581 | /* Flush the txq */ | 3616 | /* Look on all the FCP Rings for the iotag */ |
3582 | lpfc_sli_cancel_iocbs(phba, &txq, IOSTAT_LOCAL_REJECT, | 3617 | if (phba->sli_rev >= LPFC_SLI_REV4) { |
3583 | IOERR_SLI_DOWN); | 3618 | for (i = 0; i < phba->cfg_fcp_io_channel; i++) { |
3619 | pring = &psli->ring[i + MAX_SLI3_CONFIGURED_RINGS]; | ||
3620 | |||
3621 | spin_lock_irq(&pring->ring_lock); | ||
3622 | /* Retrieve everything on txq */ | ||
3623 | list_splice_init(&pring->txq, &txq); | ||
3624 | /* Retrieve everything on the txcmplq */ | ||
3625 | list_splice_init(&pring->txcmplq, &txcmplq); | ||
3626 | pring->txq_cnt = 0; | ||
3627 | pring->txcmplq_cnt = 0; | ||
3628 | spin_unlock_irq(&pring->ring_lock); | ||
3629 | |||
3630 | /* Flush the txq */ | ||
3631 | lpfc_sli_cancel_iocbs(phba, &txq, | ||
3632 | IOSTAT_LOCAL_REJECT, | ||
3633 | IOERR_SLI_DOWN); | ||
3634 | /* Flush the txcmpq */ | ||
3635 | lpfc_sli_cancel_iocbs(phba, &txcmplq, | ||
3636 | IOSTAT_LOCAL_REJECT, | ||
3637 | IOERR_SLI_DOWN); | ||
3638 | } | ||
3639 | } else { | ||
3640 | pring = &psli->ring[psli->fcp_ring]; | ||
3584 | 3641 | ||
3585 | /* Flush the txcmpq */ | 3642 | spin_lock_irq(&phba->hbalock); |
3586 | lpfc_sli_cancel_iocbs(phba, &txcmplq, IOSTAT_LOCAL_REJECT, | 3643 | /* Retrieve everything on txq */ |
3587 | IOERR_SLI_DOWN); | 3644 | list_splice_init(&pring->txq, &txq); |
3645 | /* Retrieve everything on the txcmplq */ | ||
3646 | list_splice_init(&pring->txcmplq, &txcmplq); | ||
3647 | pring->txq_cnt = 0; | ||
3648 | pring->txcmplq_cnt = 0; | ||
3649 | spin_unlock_irq(&phba->hbalock); | ||
3650 | |||
3651 | /* Flush the txq */ | ||
3652 | lpfc_sli_cancel_iocbs(phba, &txq, IOSTAT_LOCAL_REJECT, | ||
3653 | IOERR_SLI_DOWN); | ||
3654 | /* Flush the txcmpq */ | ||
3655 | lpfc_sli_cancel_iocbs(phba, &txcmplq, IOSTAT_LOCAL_REJECT, | ||
3656 | IOERR_SLI_DOWN); | ||
3657 | } | ||
3588 | } | 3658 | } |
3589 | 3659 | ||
3590 | /** | 3660 | /** |
@@ -3987,12 +4057,13 @@ lpfc_sli4_brdreset(struct lpfc_hba *phba) | |||
3987 | { | 4057 | { |
3988 | struct lpfc_sli *psli = &phba->sli; | 4058 | struct lpfc_sli *psli = &phba->sli; |
3989 | uint16_t cfg_value; | 4059 | uint16_t cfg_value; |
3990 | int rc; | 4060 | int rc = 0; |
3991 | 4061 | ||
3992 | /* Reset HBA */ | 4062 | /* Reset HBA */ |
3993 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, | 4063 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, |
3994 | "0295 Reset HBA Data: x%x x%x\n", | 4064 | "0295 Reset HBA Data: x%x x%x x%x\n", |
3995 | phba->pport->port_state, psli->sli_flag); | 4065 | phba->pport->port_state, psli->sli_flag, |
4066 | phba->hba_flag); | ||
3996 | 4067 | ||
3997 | /* perform board reset */ | 4068 | /* perform board reset */ |
3998 | phba->fc_eventTag = 0; | 4069 | phba->fc_eventTag = 0; |
@@ -4005,6 +4076,12 @@ lpfc_sli4_brdreset(struct lpfc_hba *phba) | |||
4005 | phba->fcf.fcf_flag = 0; | 4076 | phba->fcf.fcf_flag = 0; |
4006 | spin_unlock_irq(&phba->hbalock); | 4077 | spin_unlock_irq(&phba->hbalock); |
4007 | 4078 | ||
4079 | /* SLI4 INTF 2: if FW dump is being taken skip INIT_PORT */ | ||
4080 | if (phba->hba_flag & HBA_FW_DUMP_OP) { | ||
4081 | phba->hba_flag &= ~HBA_FW_DUMP_OP; | ||
4082 | return rc; | ||
4083 | } | ||
4084 | |||
4008 | /* Now physically reset the device */ | 4085 | /* Now physically reset the device */ |
4009 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, | 4086 | lpfc_printf_log(phba, KERN_INFO, LOG_INIT, |
4010 | "0389 Performing PCI function reset!\n"); | 4087 | "0389 Performing PCI function reset!\n"); |
@@ -5002,7 +5079,7 @@ lpfc_sli4_arm_cqeq_intr(struct lpfc_hba *phba) | |||
5002 | } while (++fcp_eqidx < phba->cfg_fcp_io_channel); | 5079 | } while (++fcp_eqidx < phba->cfg_fcp_io_channel); |
5003 | } | 5080 | } |
5004 | 5081 | ||
5005 | if (phba->cfg_EnableXLane) | 5082 | if (phba->cfg_fof) |
5006 | lpfc_sli4_cq_release(phba->sli4_hba.oas_cq, LPFC_QUEUE_REARM); | 5083 | lpfc_sli4_cq_release(phba->sli4_hba.oas_cq, LPFC_QUEUE_REARM); |
5007 | 5084 | ||
5008 | if (phba->sli4_hba.hba_eq) { | 5085 | if (phba->sli4_hba.hba_eq) { |
@@ -6722,7 +6799,6 @@ lpfc_mbox_timeout_handler(struct lpfc_hba *phba) | |||
6722 | LPFC_MBOXQ_t *pmbox = phba->sli.mbox_active; | 6799 | LPFC_MBOXQ_t *pmbox = phba->sli.mbox_active; |
6723 | MAILBOX_t *mb = &pmbox->u.mb; | 6800 | MAILBOX_t *mb = &pmbox->u.mb; |
6724 | struct lpfc_sli *psli = &phba->sli; | 6801 | struct lpfc_sli *psli = &phba->sli; |
6725 | struct lpfc_sli_ring *pring; | ||
6726 | 6802 | ||
6727 | /* If the mailbox completed, process the completion and return */ | 6803 | /* If the mailbox completed, process the completion and return */ |
6728 | if (lpfc_sli4_process_missed_mbox_completions(phba)) | 6804 | if (lpfc_sli4_process_missed_mbox_completions(phba)) |
@@ -6764,8 +6840,7 @@ lpfc_mbox_timeout_handler(struct lpfc_hba *phba) | |||
6764 | psli->sli_flag &= ~LPFC_SLI_ACTIVE; | 6840 | psli->sli_flag &= ~LPFC_SLI_ACTIVE; |
6765 | spin_unlock_irq(&phba->hbalock); | 6841 | spin_unlock_irq(&phba->hbalock); |
6766 | 6842 | ||
6767 | pring = &psli->ring[psli->fcp_ring]; | 6843 | lpfc_sli_abort_fcp_rings(phba); |
6768 | lpfc_sli_abort_iocb_ring(phba, pring); | ||
6769 | 6844 | ||
6770 | lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI, | 6845 | lpfc_printf_log(phba, KERN_ERR, LOG_MBOX | LOG_SLI, |
6771 | "0345 Resetting board due to mailbox timeout\n"); | 6846 | "0345 Resetting board due to mailbox timeout\n"); |
@@ -8133,6 +8208,7 @@ lpfc_sli4_iocb2wqe(struct lpfc_hba *phba, struct lpfc_iocbq *iocbq, | |||
8133 | abort_tag = (uint32_t) iocbq->iotag; | 8208 | abort_tag = (uint32_t) iocbq->iotag; |
8134 | xritag = iocbq->sli4_xritag; | 8209 | xritag = iocbq->sli4_xritag; |
8135 | wqe->generic.wqe_com.word7 = 0; /* The ct field has moved so reset */ | 8210 | wqe->generic.wqe_com.word7 = 0; /* The ct field has moved so reset */ |
8211 | wqe->generic.wqe_com.word10 = 0; | ||
8136 | /* words0-2 bpl convert bde */ | 8212 | /* words0-2 bpl convert bde */ |
8137 | if (iocbq->iocb.un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) { | 8213 | if (iocbq->iocb.un.genreq64.bdl.bdeFlags == BUFF_TYPE_BLP_64) { |
8138 | numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize / | 8214 | numBdes = iocbq->iocb.un.genreq64.bdl.bdeSize / |
@@ -8639,8 +8715,7 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t ring_number, | |||
8639 | 8715 | ||
8640 | if ((piocb->iocb_flag & LPFC_IO_FCP) || | 8716 | if ((piocb->iocb_flag & LPFC_IO_FCP) || |
8641 | (piocb->iocb_flag & LPFC_USE_FCPWQIDX)) { | 8717 | (piocb->iocb_flag & LPFC_USE_FCPWQIDX)) { |
8642 | if (!phba->cfg_EnableXLane || (!(piocb->iocb_flag & | 8718 | if (!phba->cfg_fof || (!(piocb->iocb_flag & LPFC_IO_OAS))) { |
8643 | LPFC_IO_OAS))) { | ||
8644 | wq = phba->sli4_hba.fcp_wq[piocb->fcp_wqidx]; | 8719 | wq = phba->sli4_hba.fcp_wq[piocb->fcp_wqidx]; |
8645 | } else { | 8720 | } else { |
8646 | wq = phba->sli4_hba.oas_wq; | 8721 | wq = phba->sli4_hba.oas_wq; |
@@ -8735,7 +8810,7 @@ lpfc_sli_issue_iocb(struct lpfc_hba *phba, uint32_t ring_number, | |||
8735 | 8810 | ||
8736 | if (phba->sli_rev == LPFC_SLI_REV4) { | 8811 | if (phba->sli_rev == LPFC_SLI_REV4) { |
8737 | if (piocb->iocb_flag & LPFC_IO_FCP) { | 8812 | if (piocb->iocb_flag & LPFC_IO_FCP) { |
8738 | if (!phba->cfg_EnableXLane || (!(piocb->iocb_flag & | 8813 | if (!phba->cfg_fof || (!(piocb->iocb_flag & |
8739 | LPFC_IO_OAS))) { | 8814 | LPFC_IO_OAS))) { |
8740 | if (unlikely(!phba->sli4_hba.fcp_wq)) | 8815 | if (unlikely(!phba->sli4_hba.fcp_wq)) |
8741 | return IOCB_ERROR; | 8816 | return IOCB_ERROR; |
@@ -9170,6 +9245,7 @@ lpfc_sli_queue_setup(struct lpfc_hba *phba) | |||
9170 | pring->sli.sli3.next_cmdidx = 0; | 9245 | pring->sli.sli3.next_cmdidx = 0; |
9171 | pring->sli.sli3.local_getidx = 0; | 9246 | pring->sli.sli3.local_getidx = 0; |
9172 | pring->sli.sli3.cmdidx = 0; | 9247 | pring->sli.sli3.cmdidx = 0; |
9248 | pring->flag = 0; | ||
9173 | INIT_LIST_HEAD(&pring->txq); | 9249 | INIT_LIST_HEAD(&pring->txq); |
9174 | INIT_LIST_HEAD(&pring->txcmplq); | 9250 | INIT_LIST_HEAD(&pring->txcmplq); |
9175 | INIT_LIST_HEAD(&pring->iocb_continueq); | 9251 | INIT_LIST_HEAD(&pring->iocb_continueq); |
@@ -9805,43 +9881,6 @@ abort_iotag_exit: | |||
9805 | } | 9881 | } |
9806 | 9882 | ||
9807 | /** | 9883 | /** |
9808 | * lpfc_sli_iocb_ring_abort - Unconditionally abort all iocbs on an iocb ring | ||
9809 | * @phba: Pointer to HBA context object. | ||
9810 | * @pring: Pointer to driver SLI ring object. | ||
9811 | * | ||
9812 | * This function aborts all iocbs in the given ring and frees all the iocb | ||
9813 | * objects in txq. This function issues abort iocbs unconditionally for all | ||
9814 | * the iocb commands in txcmplq. The iocbs in the txcmplq is not guaranteed | ||
9815 | * to complete before the return of this function. The caller is not required | ||
9816 | * to hold any locks. | ||
9817 | **/ | ||
9818 | static void | ||
9819 | lpfc_sli_iocb_ring_abort(struct lpfc_hba *phba, struct lpfc_sli_ring *pring) | ||
9820 | { | ||
9821 | LIST_HEAD(completions); | ||
9822 | struct lpfc_iocbq *iocb, *next_iocb; | ||
9823 | |||
9824 | if (pring->ringno == LPFC_ELS_RING) | ||
9825 | lpfc_fabric_abort_hba(phba); | ||
9826 | |||
9827 | spin_lock_irq(&phba->hbalock); | ||
9828 | |||
9829 | /* Take off all the iocbs on txq for cancelling */ | ||
9830 | list_splice_init(&pring->txq, &completions); | ||
9831 | pring->txq_cnt = 0; | ||
9832 | |||
9833 | /* Next issue ABTS for everything on the txcmplq */ | ||
9834 | list_for_each_entry_safe(iocb, next_iocb, &pring->txcmplq, list) | ||
9835 | lpfc_sli_abort_iotag_issue(phba, pring, iocb); | ||
9836 | |||
9837 | spin_unlock_irq(&phba->hbalock); | ||
9838 | |||
9839 | /* Cancel all the IOCBs from the completions list */ | ||
9840 | lpfc_sli_cancel_iocbs(phba, &completions, IOSTAT_LOCAL_REJECT, | ||
9841 | IOERR_SLI_ABORTED); | ||
9842 | } | ||
9843 | |||
9844 | /** | ||
9845 | * lpfc_sli_hba_iocb_abort - Abort all iocbs to an hba. | 9884 | * lpfc_sli_hba_iocb_abort - Abort all iocbs to an hba. |
9846 | * @phba: pointer to lpfc HBA data structure. | 9885 | * @phba: pointer to lpfc HBA data structure. |
9847 | * | 9886 | * |
@@ -9856,7 +9895,7 @@ lpfc_sli_hba_iocb_abort(struct lpfc_hba *phba) | |||
9856 | 9895 | ||
9857 | for (i = 0; i < psli->num_rings; i++) { | 9896 | for (i = 0; i < psli->num_rings; i++) { |
9858 | pring = &psli->ring[i]; | 9897 | pring = &psli->ring[i]; |
9859 | lpfc_sli_iocb_ring_abort(phba, pring); | 9898 | lpfc_sli_abort_iocb_ring(phba, pring); |
9860 | } | 9899 | } |
9861 | } | 9900 | } |
9862 | 9901 | ||
@@ -10081,6 +10120,124 @@ lpfc_sli_abort_iocb(struct lpfc_vport *vport, struct lpfc_sli_ring *pring, | |||
10081 | } | 10120 | } |
10082 | 10121 | ||
10083 | /** | 10122 | /** |
10123 | * lpfc_sli_abort_taskmgmt - issue abort for all commands on a host/target/LUN | ||
10124 | * @vport: Pointer to virtual port. | ||
10125 | * @pring: Pointer to driver SLI ring object. | ||
10126 | * @tgt_id: SCSI ID of the target. | ||
10127 | * @lun_id: LUN ID of the scsi device. | ||
10128 | * @taskmgmt_cmd: LPFC_CTX_LUN/LPFC_CTX_TGT/LPFC_CTX_HOST. | ||
10129 | * | ||
10130 | * This function sends an abort command for every SCSI command | ||
10131 | * associated with the given virtual port pending on the ring | ||
10132 | * filtered by lpfc_sli_validate_fcp_iocb function. | ||
10133 | * When taskmgmt_cmd == LPFC_CTX_LUN, the function sends abort only to the | ||
10134 | * FCP iocbs associated with lun specified by tgt_id and lun_id | ||
10135 | * parameters | ||
10136 | * When taskmgmt_cmd == LPFC_CTX_TGT, the function sends abort only to the | ||
10137 | * FCP iocbs associated with SCSI target specified by tgt_id parameter. | ||
10138 | * When taskmgmt_cmd == LPFC_CTX_HOST, the function sends abort to all | ||
10139 | * FCP iocbs associated with virtual port. | ||
10140 | * This function returns number of iocbs it aborted . | ||
10141 | * This function is called with no locks held right after a taskmgmt | ||
10142 | * command is sent. | ||
10143 | **/ | ||
10144 | int | ||
10145 | lpfc_sli_abort_taskmgmt(struct lpfc_vport *vport, struct lpfc_sli_ring *pring, | ||
10146 | uint16_t tgt_id, uint64_t lun_id, lpfc_ctx_cmd cmd) | ||
10147 | { | ||
10148 | struct lpfc_hba *phba = vport->phba; | ||
10149 | struct lpfc_iocbq *abtsiocbq; | ||
10150 | struct lpfc_iocbq *iocbq; | ||
10151 | IOCB_t *icmd; | ||
10152 | int sum, i, ret_val; | ||
10153 | unsigned long iflags; | ||
10154 | struct lpfc_sli_ring *pring_s4; | ||
10155 | uint32_t ring_number; | ||
10156 | |||
10157 | spin_lock_irq(&phba->hbalock); | ||
10158 | |||
10159 | /* all I/Os are in process of being flushed */ | ||
10160 | if (phba->hba_flag & HBA_FCP_IOQ_FLUSH) { | ||
10161 | spin_unlock_irq(&phba->hbalock); | ||
10162 | return 0; | ||
10163 | } | ||
10164 | sum = 0; | ||
10165 | |||
10166 | for (i = 1; i <= phba->sli.last_iotag; i++) { | ||
10167 | iocbq = phba->sli.iocbq_lookup[i]; | ||
10168 | |||
10169 | if (lpfc_sli_validate_fcp_iocb(iocbq, vport, tgt_id, lun_id, | ||
10170 | cmd) != 0) | ||
10171 | continue; | ||
10172 | |||
10173 | /* | ||
10174 | * If the iocbq is already being aborted, don't take a second | ||
10175 | * action, but do count it. | ||
10176 | */ | ||
10177 | if (iocbq->iocb_flag & LPFC_DRIVER_ABORTED) | ||
10178 | continue; | ||
10179 | |||
10180 | /* issue ABTS for this IOCB based on iotag */ | ||
10181 | abtsiocbq = __lpfc_sli_get_iocbq(phba); | ||
10182 | if (abtsiocbq == NULL) | ||
10183 | continue; | ||
10184 | |||
10185 | icmd = &iocbq->iocb; | ||
10186 | abtsiocbq->iocb.un.acxri.abortType = ABORT_TYPE_ABTS; | ||
10187 | abtsiocbq->iocb.un.acxri.abortContextTag = icmd->ulpContext; | ||
10188 | if (phba->sli_rev == LPFC_SLI_REV4) | ||
10189 | abtsiocbq->iocb.un.acxri.abortIoTag = | ||
10190 | iocbq->sli4_xritag; | ||
10191 | else | ||
10192 | abtsiocbq->iocb.un.acxri.abortIoTag = icmd->ulpIoTag; | ||
10193 | abtsiocbq->iocb.ulpLe = 1; | ||
10194 | abtsiocbq->iocb.ulpClass = icmd->ulpClass; | ||
10195 | abtsiocbq->vport = vport; | ||
10196 | |||
10197 | /* ABTS WQE must go to the same WQ as the WQE to be aborted */ | ||
10198 | abtsiocbq->fcp_wqidx = iocbq->fcp_wqidx; | ||
10199 | if (iocbq->iocb_flag & LPFC_IO_FCP) | ||
10200 | abtsiocbq->iocb_flag |= LPFC_USE_FCPWQIDX; | ||
10201 | |||
10202 | if (lpfc_is_link_up(phba)) | ||
10203 | abtsiocbq->iocb.ulpCommand = CMD_ABORT_XRI_CN; | ||
10204 | else | ||
10205 | abtsiocbq->iocb.ulpCommand = CMD_CLOSE_XRI_CN; | ||
10206 | |||
10207 | /* Setup callback routine and issue the command. */ | ||
10208 | abtsiocbq->iocb_cmpl = lpfc_sli_abort_fcp_cmpl; | ||
10209 | |||
10210 | /* | ||
10211 | * Indicate the IO is being aborted by the driver and set | ||
10212 | * the caller's flag into the aborted IO. | ||
10213 | */ | ||
10214 | iocbq->iocb_flag |= LPFC_DRIVER_ABORTED; | ||
10215 | |||
10216 | if (phba->sli_rev == LPFC_SLI_REV4) { | ||
10217 | ring_number = MAX_SLI3_CONFIGURED_RINGS + | ||
10218 | iocbq->fcp_wqidx; | ||
10219 | pring_s4 = &phba->sli.ring[ring_number]; | ||
10220 | /* Note: both hbalock and ring_lock must be set here */ | ||
10221 | spin_lock_irqsave(&pring_s4->ring_lock, iflags); | ||
10222 | ret_val = __lpfc_sli_issue_iocb(phba, pring_s4->ringno, | ||
10223 | abtsiocbq, 0); | ||
10224 | spin_unlock_irqrestore(&pring_s4->ring_lock, iflags); | ||
10225 | } else { | ||
10226 | ret_val = __lpfc_sli_issue_iocb(phba, pring->ringno, | ||
10227 | abtsiocbq, 0); | ||
10228 | } | ||
10229 | |||
10230 | |||
10231 | if (ret_val == IOCB_ERROR) | ||
10232 | __lpfc_sli_release_iocbq(phba, abtsiocbq); | ||
10233 | else | ||
10234 | sum++; | ||
10235 | } | ||
10236 | spin_unlock_irq(&phba->hbalock); | ||
10237 | return sum; | ||
10238 | } | ||
10239 | |||
10240 | /** | ||
10084 | * lpfc_sli_wake_iocb_wait - lpfc_sli_issue_iocb_wait's completion handler | 10241 | * lpfc_sli_wake_iocb_wait - lpfc_sli_issue_iocb_wait's completion handler |
10085 | * @phba: Pointer to HBA context object. | 10242 | * @phba: Pointer to HBA context object. |
10086 | * @cmdiocbq: Pointer to command iocb. | 10243 | * @cmdiocbq: Pointer to command iocb. |
diff --git a/drivers/scsi/lpfc/lpfc_sli.h b/drivers/scsi/lpfc/lpfc_sli.h index 6f04080f4ea8..edb48832c39b 100644 --- a/drivers/scsi/lpfc/lpfc_sli.h +++ b/drivers/scsi/lpfc/lpfc_sli.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h index 9b8cda866176..7f50aa04d66a 100644 --- a/drivers/scsi/lpfc/lpfc_sli4.h +++ b/drivers/scsi/lpfc/lpfc_sli4.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2009-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2009-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
diff --git a/drivers/scsi/lpfc/lpfc_version.h b/drivers/scsi/lpfc/lpfc_version.h index e32cbec70324..41675c1193e7 100644 --- a/drivers/scsi/lpfc/lpfc_version.h +++ b/drivers/scsi/lpfc/lpfc_version.h | |||
@@ -1,7 +1,7 @@ | |||
1 | /******************************************************************* | 1 | /******************************************************************* |
2 | * This file is part of the Emulex Linux Device Driver for * | 2 | * This file is part of the Emulex Linux Device Driver for * |
3 | * Fibre Channel Host Bus Adapters. * | 3 | * Fibre Channel Host Bus Adapters. * |
4 | * Copyright (C) 2004-2013 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2014 Emulex. All rights reserved. * |
5 | * EMULEX and SLI are trademarks of Emulex. * | 5 | * EMULEX and SLI are trademarks of Emulex. * |
6 | * www.emulex.com * | 6 | * www.emulex.com * |
7 | * * | 7 | * * |
@@ -18,7 +18,7 @@ | |||
18 | * included with this package. * | 18 | * included with this package. * |
19 | *******************************************************************/ | 19 | *******************************************************************/ |
20 | 20 | ||
21 | #define LPFC_DRIVER_VERSION "8.3.45" | 21 | #define LPFC_DRIVER_VERSION "10.2.8001.0." |
22 | #define LPFC_DRIVER_NAME "lpfc" | 22 | #define LPFC_DRIVER_NAME "lpfc" |
23 | 23 | ||
24 | /* Used for SLI 2/3 */ | 24 | /* Used for SLI 2/3 */ |
@@ -30,4 +30,4 @@ | |||
30 | 30 | ||
31 | #define LPFC_MODULE_DESC "Emulex LightPulse Fibre Channel SCSI driver " \ | 31 | #define LPFC_MODULE_DESC "Emulex LightPulse Fibre Channel SCSI driver " \ |
32 | LPFC_DRIVER_VERSION | 32 | LPFC_DRIVER_VERSION |
33 | #define LPFC_COPYRIGHT "Copyright(c) 2004-2013 Emulex. All rights reserved." | 33 | #define LPFC_COPYRIGHT "Copyright(c) 2004-2014 Emulex. All rights reserved." |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index 1fa010448666..de5d0ae19d83 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -1648,16 +1648,16 @@ typedef struct { | |||
1648 | */ | 1648 | */ |
1649 | struct crc_context { | 1649 | struct crc_context { |
1650 | uint32_t handle; /* System handle. */ | 1650 | uint32_t handle; /* System handle. */ |
1651 | uint32_t ref_tag; | 1651 | __le32 ref_tag; |
1652 | uint16_t app_tag; | 1652 | __le16 app_tag; |
1653 | uint8_t ref_tag_mask[4]; /* Validation/Replacement Mask*/ | 1653 | uint8_t ref_tag_mask[4]; /* Validation/Replacement Mask*/ |
1654 | uint8_t app_tag_mask[2]; /* Validation/Replacement Mask*/ | 1654 | uint8_t app_tag_mask[2]; /* Validation/Replacement Mask*/ |
1655 | uint16_t guard_seed; /* Initial Guard Seed */ | 1655 | __le16 guard_seed; /* Initial Guard Seed */ |
1656 | uint16_t prot_opts; /* Requested Data Protection Mode */ | 1656 | __le16 prot_opts; /* Requested Data Protection Mode */ |
1657 | uint16_t blk_size; /* Data size in bytes */ | 1657 | __le16 blk_size; /* Data size in bytes */ |
1658 | uint16_t runt_blk_guard; /* Guard value for runt block (tape | 1658 | uint16_t runt_blk_guard; /* Guard value for runt block (tape |
1659 | * only) */ | 1659 | * only) */ |
1660 | uint32_t byte_count; /* Total byte count/ total data | 1660 | __le32 byte_count; /* Total byte count/ total data |
1661 | * transfer count */ | 1661 | * transfer count */ |
1662 | union { | 1662 | union { |
1663 | struct { | 1663 | struct { |
@@ -1671,10 +1671,10 @@ struct crc_context { | |||
1671 | uint32_t reserved_6; | 1671 | uint32_t reserved_6; |
1672 | } nobundling; | 1672 | } nobundling; |
1673 | struct { | 1673 | struct { |
1674 | uint32_t dif_byte_count; /* Total DIF byte | 1674 | __le32 dif_byte_count; /* Total DIF byte |
1675 | * count */ | 1675 | * count */ |
1676 | uint16_t reserved_1; | 1676 | uint16_t reserved_1; |
1677 | uint16_t dseg_count; /* Data segment count */ | 1677 | __le16 dseg_count; /* Data segment count */ |
1678 | uint32_t reserved_2; | 1678 | uint32_t reserved_2; |
1679 | uint32_t data_address[2]; | 1679 | uint32_t data_address[2]; |
1680 | uint32_t data_length; | 1680 | uint32_t data_length; |
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index 8d85ed8d8917..4b188b0164e9 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c | |||
@@ -1996,7 +1996,7 @@ qlt_set_t10dif_tags(struct se_cmd *se_cmd, struct crc_context *ctx) | |||
1996 | * have been immplemented by TCM, before AppTag is avail. | 1996 | * have been immplemented by TCM, before AppTag is avail. |
1997 | * Look for modesense_handlers[] | 1997 | * Look for modesense_handlers[] |
1998 | */ | 1998 | */ |
1999 | ctx->app_tag = __constant_cpu_to_le16(0); | 1999 | ctx->app_tag = 0; |
2000 | ctx->app_tag_mask[0] = 0x0; | 2000 | ctx->app_tag_mask[0] = 0x0; |
2001 | ctx->app_tag_mask[1] = 0x0; | 2001 | ctx->app_tag_mask[1] = 0x0; |
2002 | 2002 | ||
@@ -2078,6 +2078,7 @@ qlt_build_ctio_crc2_pkt(struct qla_tgt_prm *prm, scsi_qla_host_t *vha) | |||
2078 | struct se_cmd *se_cmd = &cmd->se_cmd; | 2078 | struct se_cmd *se_cmd = &cmd->se_cmd; |
2079 | uint32_t h; | 2079 | uint32_t h; |
2080 | struct atio_from_isp *atio = &prm->cmd->atio; | 2080 | struct atio_from_isp *atio = &prm->cmd->atio; |
2081 | uint16_t t16; | ||
2081 | 2082 | ||
2082 | sgc = 0; | 2083 | sgc = 0; |
2083 | ha = vha->hw; | 2084 | ha = vha->hw; |
@@ -2174,8 +2175,13 @@ qlt_build_ctio_crc2_pkt(struct qla_tgt_prm *prm, scsi_qla_host_t *vha) | |||
2174 | pkt->initiator_id[1] = atio->u.isp24.fcp_hdr.s_id[1]; | 2175 | pkt->initiator_id[1] = atio->u.isp24.fcp_hdr.s_id[1]; |
2175 | pkt->initiator_id[2] = atio->u.isp24.fcp_hdr.s_id[0]; | 2176 | pkt->initiator_id[2] = atio->u.isp24.fcp_hdr.s_id[0]; |
2176 | pkt->exchange_addr = atio->u.isp24.exchange_addr; | 2177 | pkt->exchange_addr = atio->u.isp24.exchange_addr; |
2177 | pkt->ox_id = swab16(atio->u.isp24.fcp_hdr.ox_id); | 2178 | |
2178 | pkt->flags |= (atio->u.isp24.attr << 9); | 2179 | /* silence compile warning */ |
2180 | t16 = be16_to_cpu(atio->u.isp24.fcp_hdr.ox_id); | ||
2181 | pkt->ox_id = cpu_to_le16(t16); | ||
2182 | |||
2183 | t16 = (atio->u.isp24.attr << 9); | ||
2184 | pkt->flags |= cpu_to_le16(t16); | ||
2179 | pkt->relative_offset = cpu_to_le32(prm->cmd->offset); | 2185 | pkt->relative_offset = cpu_to_le32(prm->cmd->offset); |
2180 | 2186 | ||
2181 | /* Set transfer direction */ | 2187 | /* Set transfer direction */ |
@@ -2250,8 +2256,7 @@ qlt_build_ctio_crc2_pkt(struct qla_tgt_prm *prm, scsi_qla_host_t *vha) | |||
2250 | 2256 | ||
2251 | if (bundling && prm->prot_seg_cnt) { | 2257 | if (bundling && prm->prot_seg_cnt) { |
2252 | /* Walks dif segments */ | 2258 | /* Walks dif segments */ |
2253 | pkt->add_flags |= | 2259 | pkt->add_flags |= CTIO_CRC2_AF_DIF_DSD_ENA; |
2254 | __constant_cpu_to_le16(CTIO_CRC2_AF_DIF_DSD_ENA); | ||
2255 | 2260 | ||
2256 | cur_dsd = (uint32_t *) &crc_ctx_pkt->u.bundling.dif_address; | 2261 | cur_dsd = (uint32_t *) &crc_ctx_pkt->u.bundling.dif_address; |
2257 | if (qla24xx_walk_and_build_prot_sglist(ha, NULL, cur_dsd, | 2262 | if (qla24xx_walk_and_build_prot_sglist(ha, NULL, cur_dsd, |
diff --git a/drivers/scsi/qla2xxx/qla_target.h b/drivers/scsi/qla2xxx/qla_target.h index 5c9f185a8ebd..e0a58fd13f66 100644 --- a/drivers/scsi/qla2xxx/qla_target.h +++ b/drivers/scsi/qla2xxx/qla_target.h | |||
@@ -316,7 +316,7 @@ struct fcp_hdr { | |||
316 | uint8_t seq_id; | 316 | uint8_t seq_id; |
317 | uint8_t df_ctl; | 317 | uint8_t df_ctl; |
318 | uint16_t seq_cnt; | 318 | uint16_t seq_cnt; |
319 | uint16_t ox_id; | 319 | __be16 ox_id; |
320 | uint16_t rx_id; | 320 | uint16_t rx_id; |
321 | uint32_t parameter; | 321 | uint32_t parameter; |
322 | } __packed; | 322 | } __packed; |
@@ -441,7 +441,7 @@ struct ctio7_to_24xx { | |||
441 | union { | 441 | union { |
442 | struct { | 442 | struct { |
443 | uint16_t reserved1; | 443 | uint16_t reserved1; |
444 | uint16_t flags; | 444 | __le16 flags; |
445 | uint32_t residual; | 445 | uint32_t residual; |
446 | uint16_t ox_id; | 446 | uint16_t ox_id; |
447 | uint16_t scsi_status; | 447 | uint16_t scsi_status; |
@@ -527,7 +527,7 @@ struct ctio_crc2_to_fw { | |||
527 | 527 | ||
528 | uint32_t handle; /* System handle. */ | 528 | uint32_t handle; /* System handle. */ |
529 | uint16_t nport_handle; /* N_PORT handle. */ | 529 | uint16_t nport_handle; /* N_PORT handle. */ |
530 | uint16_t timeout; /* Command timeout. */ | 530 | __le16 timeout; /* Command timeout. */ |
531 | 531 | ||
532 | uint16_t dseg_count; /* Data segment count. */ | 532 | uint16_t dseg_count; /* Data segment count. */ |
533 | uint8_t vp_index; | 533 | uint8_t vp_index; |
@@ -538,15 +538,15 @@ struct ctio_crc2_to_fw { | |||
538 | uint8_t reserved1; | 538 | uint8_t reserved1; |
539 | uint32_t exchange_addr; /* rcv exchange address */ | 539 | uint32_t exchange_addr; /* rcv exchange address */ |
540 | uint16_t reserved2; | 540 | uint16_t reserved2; |
541 | uint16_t flags; /* refer to CTIO7 flags values */ | 541 | __le16 flags; /* refer to CTIO7 flags values */ |
542 | uint32_t residual; | 542 | uint32_t residual; |
543 | uint16_t ox_id; | 543 | __le16 ox_id; |
544 | uint16_t scsi_status; | 544 | uint16_t scsi_status; |
545 | uint32_t relative_offset; | 545 | __le32 relative_offset; |
546 | uint32_t reserved5; | 546 | uint32_t reserved5; |
547 | uint32_t transfer_length; /* total fc transfer length */ | 547 | __le32 transfer_length; /* total fc transfer length */ |
548 | uint32_t reserved6; | 548 | uint32_t reserved6; |
549 | uint32_t crc_context_address[2];/* Data segment address. */ | 549 | __le32 crc_context_address[2];/* Data segment address. */ |
550 | uint16_t crc_context_len; /* Data segment length. */ | 550 | uint16_t crc_context_len; /* Data segment length. */ |
551 | uint16_t reserved_1; /* MUST be set to 0. */ | 551 | uint16_t reserved_1; /* MUST be set to 0. */ |
552 | } __packed; | 552 | } __packed; |