diff options
Diffstat (limited to 'drivers/scsi/lpfc/lpfc_attr.c')
-rw-r--r-- | drivers/scsi/lpfc/lpfc_attr.c | 256 |
1 files changed, 173 insertions, 83 deletions
diff --git a/drivers/scsi/lpfc/lpfc_attr.c b/drivers/scsi/lpfc/lpfc_attr.c index c14f0cbdb125..fc07be5fbce9 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-2008 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2009 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 * |
@@ -30,8 +30,10 @@ | |||
30 | #include <scsi/scsi_tcq.h> | 30 | #include <scsi/scsi_tcq.h> |
31 | #include <scsi/scsi_transport_fc.h> | 31 | #include <scsi/scsi_transport_fc.h> |
32 | 32 | ||
33 | #include "lpfc_hw4.h" | ||
33 | #include "lpfc_hw.h" | 34 | #include "lpfc_hw.h" |
34 | #include "lpfc_sli.h" | 35 | #include "lpfc_sli.h" |
36 | #include "lpfc_sli4.h" | ||
35 | #include "lpfc_nl.h" | 37 | #include "lpfc_nl.h" |
36 | #include "lpfc_disc.h" | 38 | #include "lpfc_disc.h" |
37 | #include "lpfc_scsi.h" | 39 | #include "lpfc_scsi.h" |
@@ -505,12 +507,14 @@ lpfc_issue_lip(struct Scsi_Host *shost) | |||
505 | return -ENOMEM; | 507 | return -ENOMEM; |
506 | 508 | ||
507 | memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); | 509 | memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); |
508 | pmboxq->mb.mbxCommand = MBX_DOWN_LINK; | 510 | pmboxq->u.mb.mbxCommand = MBX_DOWN_LINK; |
509 | pmboxq->mb.mbxOwner = OWN_HOST; | 511 | pmboxq->u.mb.mbxOwner = OWN_HOST; |
510 | 512 | ||
511 | mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO * 2); | 513 | mbxstatus = lpfc_sli_issue_mbox_wait(phba, pmboxq, LPFC_MBOX_TMO * 2); |
512 | 514 | ||
513 | if ((mbxstatus == MBX_SUCCESS) && (pmboxq->mb.mbxStatus == 0)) { | 515 | if ((mbxstatus == MBX_SUCCESS) && |
516 | (pmboxq->u.mb.mbxStatus == 0 || | ||
517 | pmboxq->u.mb.mbxStatus == MBXERR_LINK_DOWN)) { | ||
514 | memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); | 518 | memset((void *)pmboxq, 0, sizeof (LPFC_MBOXQ_t)); |
515 | lpfc_init_link(phba, pmboxq, phba->cfg_topology, | 519 | lpfc_init_link(phba, pmboxq, phba->cfg_topology, |
516 | phba->cfg_link_speed); | 520 | phba->cfg_link_speed); |
@@ -789,7 +793,8 @@ lpfc_get_hba_info(struct lpfc_hba *phba, | |||
789 | uint32_t *mrpi, uint32_t *arpi, | 793 | uint32_t *mrpi, uint32_t *arpi, |
790 | uint32_t *mvpi, uint32_t *avpi) | 794 | uint32_t *mvpi, uint32_t *avpi) |
791 | { | 795 | { |
792 | struct lpfc_sli *psli = &phba->sli; | 796 | struct lpfc_sli *psli = &phba->sli; |
797 | struct lpfc_mbx_read_config *rd_config; | ||
793 | LPFC_MBOXQ_t *pmboxq; | 798 | LPFC_MBOXQ_t *pmboxq; |
794 | MAILBOX_t *pmb; | 799 | MAILBOX_t *pmb; |
795 | int rc = 0; | 800 | int rc = 0; |
@@ -800,7 +805,7 @@ lpfc_get_hba_info(struct lpfc_hba *phba, | |||
800 | */ | 805 | */ |
801 | if (phba->link_state < LPFC_LINK_DOWN || | 806 | if (phba->link_state < LPFC_LINK_DOWN || |
802 | !phba->mbox_mem_pool || | 807 | !phba->mbox_mem_pool || |
803 | (phba->sli.sli_flag & LPFC_SLI2_ACTIVE) == 0) | 808 | (phba->sli.sli_flag & LPFC_SLI_ACTIVE) == 0) |
804 | return 0; | 809 | return 0; |
805 | 810 | ||
806 | if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) | 811 | if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) |
@@ -811,13 +816,13 @@ lpfc_get_hba_info(struct lpfc_hba *phba, | |||
811 | return 0; | 816 | return 0; |
812 | memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t)); | 817 | memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t)); |
813 | 818 | ||
814 | pmb = &pmboxq->mb; | 819 | pmb = &pmboxq->u.mb; |
815 | pmb->mbxCommand = MBX_READ_CONFIG; | 820 | pmb->mbxCommand = MBX_READ_CONFIG; |
816 | pmb->mbxOwner = OWN_HOST; | 821 | pmb->mbxOwner = OWN_HOST; |
817 | pmboxq->context1 = NULL; | 822 | pmboxq->context1 = NULL; |
818 | 823 | ||
819 | if ((phba->pport->fc_flag & FC_OFFLINE_MODE) || | 824 | if ((phba->pport->fc_flag & FC_OFFLINE_MODE) || |
820 | (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) | 825 | (!(psli->sli_flag & LPFC_SLI_ACTIVE))) |
821 | rc = MBX_NOT_FINISHED; | 826 | rc = MBX_NOT_FINISHED; |
822 | else | 827 | else |
823 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); | 828 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); |
@@ -828,18 +833,37 @@ lpfc_get_hba_info(struct lpfc_hba *phba, | |||
828 | return 0; | 833 | return 0; |
829 | } | 834 | } |
830 | 835 | ||
831 | if (mrpi) | 836 | if (phba->sli_rev == LPFC_SLI_REV4) { |
832 | *mrpi = pmb->un.varRdConfig.max_rpi; | 837 | rd_config = &pmboxq->u.mqe.un.rd_config; |
833 | if (arpi) | 838 | if (mrpi) |
834 | *arpi = pmb->un.varRdConfig.avail_rpi; | 839 | *mrpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config); |
835 | if (mxri) | 840 | if (arpi) |
836 | *mxri = pmb->un.varRdConfig.max_xri; | 841 | *arpi = bf_get(lpfc_mbx_rd_conf_rpi_count, rd_config) - |
837 | if (axri) | 842 | phba->sli4_hba.max_cfg_param.rpi_used; |
838 | *axri = pmb->un.varRdConfig.avail_xri; | 843 | if (mxri) |
839 | if (mvpi) | 844 | *mxri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config); |
840 | *mvpi = pmb->un.varRdConfig.max_vpi; | 845 | if (axri) |
841 | if (avpi) | 846 | *axri = bf_get(lpfc_mbx_rd_conf_xri_count, rd_config) - |
842 | *avpi = pmb->un.varRdConfig.avail_vpi; | 847 | phba->sli4_hba.max_cfg_param.xri_used; |
848 | if (mvpi) | ||
849 | *mvpi = bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config); | ||
850 | if (avpi) | ||
851 | *avpi = bf_get(lpfc_mbx_rd_conf_vpi_count, rd_config) - | ||
852 | phba->sli4_hba.max_cfg_param.vpi_used; | ||
853 | } else { | ||
854 | if (mrpi) | ||
855 | *mrpi = pmb->un.varRdConfig.max_rpi; | ||
856 | if (arpi) | ||
857 | *arpi = pmb->un.varRdConfig.avail_rpi; | ||
858 | if (mxri) | ||
859 | *mxri = pmb->un.varRdConfig.max_xri; | ||
860 | if (axri) | ||
861 | *axri = pmb->un.varRdConfig.avail_xri; | ||
862 | if (mvpi) | ||
863 | *mvpi = pmb->un.varRdConfig.max_vpi; | ||
864 | if (avpi) | ||
865 | *avpi = pmb->un.varRdConfig.avail_vpi; | ||
866 | } | ||
843 | 867 | ||
844 | mempool_free(pmboxq, phba->mbox_mem_pool); | 868 | mempool_free(pmboxq, phba->mbox_mem_pool); |
845 | return 1; | 869 | return 1; |
@@ -2021,22 +2045,9 @@ static DEVICE_ATTR(lpfc_devloss_tmo, S_IRUGO | S_IWUSR, | |||
2021 | # lpfc_log_verbose: Only turn this flag on if you are willing to risk being | 2045 | # lpfc_log_verbose: Only turn this flag on if you are willing to risk being |
2022 | # deluged with LOTS of information. | 2046 | # deluged with LOTS of information. |
2023 | # You can set a bit mask to record specific types of verbose messages: | 2047 | # You can set a bit mask to record specific types of verbose messages: |
2024 | # | 2048 | # See lpfc_logmsh.h for definitions. |
2025 | # LOG_ELS 0x1 ELS events | ||
2026 | # LOG_DISCOVERY 0x2 Link discovery events | ||
2027 | # LOG_MBOX 0x4 Mailbox events | ||
2028 | # LOG_INIT 0x8 Initialization events | ||
2029 | # LOG_LINK_EVENT 0x10 Link events | ||
2030 | # LOG_FCP 0x40 FCP traffic history | ||
2031 | # LOG_NODE 0x80 Node table events | ||
2032 | # LOG_BG 0x200 BlockBuard events | ||
2033 | # LOG_MISC 0x400 Miscellaneous events | ||
2034 | # LOG_SLI 0x800 SLI events | ||
2035 | # LOG_FCP_ERROR 0x1000 Only log FCP errors | ||
2036 | # LOG_LIBDFC 0x2000 LIBDFC events | ||
2037 | # LOG_ALL_MSG 0xffff LOG all messages | ||
2038 | */ | 2049 | */ |
2039 | LPFC_VPORT_ATTR_HEX_RW(log_verbose, 0x0, 0x0, 0xffff, | 2050 | LPFC_VPORT_ATTR_HEX_RW(log_verbose, 0x0, 0x0, 0xffffffff, |
2040 | "Verbose logging bit-mask"); | 2051 | "Verbose logging bit-mask"); |
2041 | 2052 | ||
2042 | /* | 2053 | /* |
@@ -2266,6 +2277,36 @@ lpfc_param_init(topology, 0, 0, 6) | |||
2266 | static DEVICE_ATTR(lpfc_topology, S_IRUGO | S_IWUSR, | 2277 | static DEVICE_ATTR(lpfc_topology, S_IRUGO | S_IWUSR, |
2267 | lpfc_topology_show, lpfc_topology_store); | 2278 | lpfc_topology_show, lpfc_topology_store); |
2268 | 2279 | ||
2280 | /** | ||
2281 | * lpfc_static_vport_show: Read callback function for | ||
2282 | * lpfc_static_vport sysfs file. | ||
2283 | * @dev: Pointer to class device object. | ||
2284 | * @attr: device attribute structure. | ||
2285 | * @buf: Data buffer. | ||
2286 | * | ||
2287 | * This function is the read call back function for | ||
2288 | * lpfc_static_vport sysfs file. The lpfc_static_vport | ||
2289 | * sysfs file report the mageability of the vport. | ||
2290 | **/ | ||
2291 | static ssize_t | ||
2292 | lpfc_static_vport_show(struct device *dev, struct device_attribute *attr, | ||
2293 | char *buf) | ||
2294 | { | ||
2295 | struct Scsi_Host *shost = class_to_shost(dev); | ||
2296 | struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; | ||
2297 | if (vport->vport_flag & STATIC_VPORT) | ||
2298 | sprintf(buf, "1\n"); | ||
2299 | else | ||
2300 | sprintf(buf, "0\n"); | ||
2301 | |||
2302 | return strlen(buf); | ||
2303 | } | ||
2304 | |||
2305 | /* | ||
2306 | * Sysfs attribute to control the statistical data collection. | ||
2307 | */ | ||
2308 | static DEVICE_ATTR(lpfc_static_vport, S_IRUGO, | ||
2309 | lpfc_static_vport_show, NULL); | ||
2269 | 2310 | ||
2270 | /** | 2311 | /** |
2271 | * lpfc_stat_data_ctrl_store - write call back for lpfc_stat_data_ctrl sysfs file | 2312 | * lpfc_stat_data_ctrl_store - write call back for lpfc_stat_data_ctrl sysfs file |
@@ -2341,7 +2382,7 @@ lpfc_stat_data_ctrl_store(struct device *dev, struct device_attribute *attr, | |||
2341 | if (vports == NULL) | 2382 | if (vports == NULL) |
2342 | return -ENOMEM; | 2383 | return -ENOMEM; |
2343 | 2384 | ||
2344 | for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) { | 2385 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { |
2345 | v_shost = lpfc_shost_from_vport(vports[i]); | 2386 | v_shost = lpfc_shost_from_vport(vports[i]); |
2346 | spin_lock_irq(v_shost->host_lock); | 2387 | spin_lock_irq(v_shost->host_lock); |
2347 | /* Block and reset data collection */ | 2388 | /* Block and reset data collection */ |
@@ -2356,7 +2397,7 @@ lpfc_stat_data_ctrl_store(struct device *dev, struct device_attribute *attr, | |||
2356 | phba->bucket_base = base; | 2397 | phba->bucket_base = base; |
2357 | phba->bucket_step = step; | 2398 | phba->bucket_step = step; |
2358 | 2399 | ||
2359 | for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) { | 2400 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { |
2360 | v_shost = lpfc_shost_from_vport(vports[i]); | 2401 | v_shost = lpfc_shost_from_vport(vports[i]); |
2361 | 2402 | ||
2362 | /* Unblock data collection */ | 2403 | /* Unblock data collection */ |
@@ -2373,7 +2414,7 @@ lpfc_stat_data_ctrl_store(struct device *dev, struct device_attribute *attr, | |||
2373 | if (vports == NULL) | 2414 | if (vports == NULL) |
2374 | return -ENOMEM; | 2415 | return -ENOMEM; |
2375 | 2416 | ||
2376 | for (i = 0; i <= phba->max_vpi && vports[i] != NULL; i++) { | 2417 | for (i = 0; i <= phba->max_vports && vports[i] != NULL; i++) { |
2377 | v_shost = lpfc_shost_from_vport(vports[i]); | 2418 | v_shost = lpfc_shost_from_vport(vports[i]); |
2378 | spin_lock_irq(shost->host_lock); | 2419 | spin_lock_irq(shost->host_lock); |
2379 | vports[i]->stat_data_blocked = 1; | 2420 | vports[i]->stat_data_blocked = 1; |
@@ -2844,15 +2885,39 @@ LPFC_ATTR_RW(poll_tmo, 10, 1, 255, | |||
2844 | /* | 2885 | /* |
2845 | # lpfc_use_msi: Use MSI (Message Signaled Interrupts) in systems that | 2886 | # lpfc_use_msi: Use MSI (Message Signaled Interrupts) in systems that |
2846 | # support this feature | 2887 | # support this feature |
2847 | # 0 = MSI disabled | 2888 | # 0 = MSI disabled (default) |
2848 | # 1 = MSI enabled | 2889 | # 1 = MSI enabled |
2849 | # 2 = MSI-X enabled (default) | 2890 | # 2 = MSI-X enabled |
2850 | # Value range is [0,2]. Default value is 2. | 2891 | # Value range is [0,2]. Default value is 0. |
2851 | */ | 2892 | */ |
2852 | LPFC_ATTR_R(use_msi, 2, 0, 2, "Use Message Signaled Interrupts (1) or " | 2893 | LPFC_ATTR_R(use_msi, 0, 0, 2, "Use Message Signaled Interrupts (1) or " |
2853 | "MSI-X (2), if possible"); | 2894 | "MSI-X (2), if possible"); |
2854 | 2895 | ||
2855 | /* | 2896 | /* |
2897 | # lpfc_fcp_imax: Set the maximum number of fast-path FCP interrupts per second | ||
2898 | # | ||
2899 | # Value range is [636,651042]. Default value is 10000. | ||
2900 | */ | ||
2901 | LPFC_ATTR_R(fcp_imax, LPFC_FP_DEF_IMAX, LPFC_MIM_IMAX, LPFC_DMULT_CONST, | ||
2902 | "Set the maximum number of fast-path FCP interrupts per second"); | ||
2903 | |||
2904 | /* | ||
2905 | # lpfc_fcp_wq_count: Set the number of fast-path FCP work queues | ||
2906 | # | ||
2907 | # Value range is [1,31]. Default value is 4. | ||
2908 | */ | ||
2909 | LPFC_ATTR_R(fcp_wq_count, LPFC_FP_WQN_DEF, LPFC_FP_WQN_MIN, LPFC_FP_WQN_MAX, | ||
2910 | "Set the number of fast-path FCP work queues, if possible"); | ||
2911 | |||
2912 | /* | ||
2913 | # lpfc_fcp_eq_count: Set the number of fast-path FCP event queues | ||
2914 | # | ||
2915 | # Value range is [1,7]. Default value is 1. | ||
2916 | */ | ||
2917 | LPFC_ATTR_R(fcp_eq_count, LPFC_FP_EQN_DEF, LPFC_FP_EQN_MIN, LPFC_FP_EQN_MAX, | ||
2918 | "Set the number of fast-path FCP event queues, if possible"); | ||
2919 | |||
2920 | /* | ||
2856 | # lpfc_enable_hba_reset: Allow or prevent HBA resets to the hardware. | 2921 | # lpfc_enable_hba_reset: Allow or prevent HBA resets to the hardware. |
2857 | # 0 = HBA resets disabled | 2922 | # 0 = HBA resets disabled |
2858 | # 1 = HBA resets enabled (default) | 2923 | # 1 = HBA resets enabled (default) |
@@ -2876,6 +2941,14 @@ LPFC_ATTR_R(enable_hba_heartbeat, 1, 0, 1, "Enable HBA Heartbeat."); | |||
2876 | */ | 2941 | */ |
2877 | LPFC_ATTR_R(enable_bg, 0, 0, 1, "Enable BlockGuard Support"); | 2942 | LPFC_ATTR_R(enable_bg, 0, 0, 1, "Enable BlockGuard Support"); |
2878 | 2943 | ||
2944 | /* | ||
2945 | # lpfc_enable_fip: When set, FIP is required to start discovery. If not | ||
2946 | # set, the driver will add an FCF record manually if the port has no | ||
2947 | # FCF records available and start discovery. | ||
2948 | # Value range is [0,1]. Default value is 1 (enabled) | ||
2949 | */ | ||
2950 | LPFC_ATTR_RW(enable_fip, 0, 0, 1, "Enable FIP Discovery"); | ||
2951 | |||
2879 | 2952 | ||
2880 | /* | 2953 | /* |
2881 | # lpfc_prot_mask: i | 2954 | # lpfc_prot_mask: i |
@@ -2942,6 +3015,7 @@ struct device_attribute *lpfc_hba_attrs[] = { | |||
2942 | &dev_attr_lpfc_peer_port_login, | 3015 | &dev_attr_lpfc_peer_port_login, |
2943 | &dev_attr_lpfc_nodev_tmo, | 3016 | &dev_attr_lpfc_nodev_tmo, |
2944 | &dev_attr_lpfc_devloss_tmo, | 3017 | &dev_attr_lpfc_devloss_tmo, |
3018 | &dev_attr_lpfc_enable_fip, | ||
2945 | &dev_attr_lpfc_fcp_class, | 3019 | &dev_attr_lpfc_fcp_class, |
2946 | &dev_attr_lpfc_use_adisc, | 3020 | &dev_attr_lpfc_use_adisc, |
2947 | &dev_attr_lpfc_ack0, | 3021 | &dev_attr_lpfc_ack0, |
@@ -2969,6 +3043,9 @@ struct device_attribute *lpfc_hba_attrs[] = { | |||
2969 | &dev_attr_lpfc_poll, | 3043 | &dev_attr_lpfc_poll, |
2970 | &dev_attr_lpfc_poll_tmo, | 3044 | &dev_attr_lpfc_poll_tmo, |
2971 | &dev_attr_lpfc_use_msi, | 3045 | &dev_attr_lpfc_use_msi, |
3046 | &dev_attr_lpfc_fcp_imax, | ||
3047 | &dev_attr_lpfc_fcp_wq_count, | ||
3048 | &dev_attr_lpfc_fcp_eq_count, | ||
2972 | &dev_attr_lpfc_enable_bg, | 3049 | &dev_attr_lpfc_enable_bg, |
2973 | &dev_attr_lpfc_soft_wwnn, | 3050 | &dev_attr_lpfc_soft_wwnn, |
2974 | &dev_attr_lpfc_soft_wwpn, | 3051 | &dev_attr_lpfc_soft_wwpn, |
@@ -2991,6 +3068,7 @@ struct device_attribute *lpfc_vport_attrs[] = { | |||
2991 | &dev_attr_lpfc_lun_queue_depth, | 3068 | &dev_attr_lpfc_lun_queue_depth, |
2992 | &dev_attr_lpfc_nodev_tmo, | 3069 | &dev_attr_lpfc_nodev_tmo, |
2993 | &dev_attr_lpfc_devloss_tmo, | 3070 | &dev_attr_lpfc_devloss_tmo, |
3071 | &dev_attr_lpfc_enable_fip, | ||
2994 | &dev_attr_lpfc_hba_queue_depth, | 3072 | &dev_attr_lpfc_hba_queue_depth, |
2995 | &dev_attr_lpfc_peer_port_login, | 3073 | &dev_attr_lpfc_peer_port_login, |
2996 | &dev_attr_lpfc_restrict_login, | 3074 | &dev_attr_lpfc_restrict_login, |
@@ -3003,6 +3081,7 @@ struct device_attribute *lpfc_vport_attrs[] = { | |||
3003 | &dev_attr_lpfc_enable_da_id, | 3081 | &dev_attr_lpfc_enable_da_id, |
3004 | &dev_attr_lpfc_max_scsicmpl_time, | 3082 | &dev_attr_lpfc_max_scsicmpl_time, |
3005 | &dev_attr_lpfc_stat_data_ctrl, | 3083 | &dev_attr_lpfc_stat_data_ctrl, |
3084 | &dev_attr_lpfc_static_vport, | ||
3006 | NULL, | 3085 | NULL, |
3007 | }; | 3086 | }; |
3008 | 3087 | ||
@@ -3034,6 +3113,9 @@ sysfs_ctlreg_write(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3034 | struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; | 3113 | struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; |
3035 | struct lpfc_hba *phba = vport->phba; | 3114 | struct lpfc_hba *phba = vport->phba; |
3036 | 3115 | ||
3116 | if (phba->sli_rev >= LPFC_SLI_REV4) | ||
3117 | return -EPERM; | ||
3118 | |||
3037 | if ((off + count) > FF_REG_AREA_SIZE) | 3119 | if ((off + count) > FF_REG_AREA_SIZE) |
3038 | return -ERANGE; | 3120 | return -ERANGE; |
3039 | 3121 | ||
@@ -3084,6 +3166,9 @@ sysfs_ctlreg_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3084 | struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; | 3166 | struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; |
3085 | struct lpfc_hba *phba = vport->phba; | 3167 | struct lpfc_hba *phba = vport->phba; |
3086 | 3168 | ||
3169 | if (phba->sli_rev >= LPFC_SLI_REV4) | ||
3170 | return -EPERM; | ||
3171 | |||
3087 | if (off > FF_REG_AREA_SIZE) | 3172 | if (off > FF_REG_AREA_SIZE) |
3088 | return -ERANGE; | 3173 | return -ERANGE; |
3089 | 3174 | ||
@@ -3199,7 +3284,7 @@ sysfs_mbox_write(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3199 | } | 3284 | } |
3200 | } | 3285 | } |
3201 | 3286 | ||
3202 | memcpy((uint8_t *) & phba->sysfs_mbox.mbox->mb + off, | 3287 | memcpy((uint8_t *) &phba->sysfs_mbox.mbox->u.mb + off, |
3203 | buf, count); | 3288 | buf, count); |
3204 | 3289 | ||
3205 | phba->sysfs_mbox.offset = off + count; | 3290 | phba->sysfs_mbox.offset = off + count; |
@@ -3241,6 +3326,7 @@ sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3241 | struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; | 3326 | struct lpfc_vport *vport = (struct lpfc_vport *) shost->hostdata; |
3242 | struct lpfc_hba *phba = vport->phba; | 3327 | struct lpfc_hba *phba = vport->phba; |
3243 | int rc; | 3328 | int rc; |
3329 | MAILBOX_t *pmb; | ||
3244 | 3330 | ||
3245 | if (off > MAILBOX_CMD_SIZE) | 3331 | if (off > MAILBOX_CMD_SIZE) |
3246 | return -ERANGE; | 3332 | return -ERANGE; |
@@ -3265,8 +3351,8 @@ sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3265 | if (off == 0 && | 3351 | if (off == 0 && |
3266 | phba->sysfs_mbox.state == SMBOX_WRITING && | 3352 | phba->sysfs_mbox.state == SMBOX_WRITING && |
3267 | phba->sysfs_mbox.offset >= 2 * sizeof(uint32_t)) { | 3353 | phba->sysfs_mbox.offset >= 2 * sizeof(uint32_t)) { |
3268 | 3354 | pmb = &phba->sysfs_mbox.mbox->u.mb; | |
3269 | switch (phba->sysfs_mbox.mbox->mb.mbxCommand) { | 3355 | switch (pmb->mbxCommand) { |
3270 | /* Offline only */ | 3356 | /* Offline only */ |
3271 | case MBX_INIT_LINK: | 3357 | case MBX_INIT_LINK: |
3272 | case MBX_DOWN_LINK: | 3358 | case MBX_DOWN_LINK: |
@@ -3283,7 +3369,7 @@ sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3283 | if (!(vport->fc_flag & FC_OFFLINE_MODE)) { | 3369 | if (!(vport->fc_flag & FC_OFFLINE_MODE)) { |
3284 | printk(KERN_WARNING "mbox_read:Command 0x%x " | 3370 | printk(KERN_WARNING "mbox_read:Command 0x%x " |
3285 | "is illegal in on-line state\n", | 3371 | "is illegal in on-line state\n", |
3286 | phba->sysfs_mbox.mbox->mb.mbxCommand); | 3372 | pmb->mbxCommand); |
3287 | sysfs_mbox_idle(phba); | 3373 | sysfs_mbox_idle(phba); |
3288 | spin_unlock_irq(&phba->hbalock); | 3374 | spin_unlock_irq(&phba->hbalock); |
3289 | return -EPERM; | 3375 | return -EPERM; |
@@ -3319,13 +3405,13 @@ sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3319 | case MBX_CONFIG_PORT: | 3405 | case MBX_CONFIG_PORT: |
3320 | case MBX_RUN_BIU_DIAG: | 3406 | case MBX_RUN_BIU_DIAG: |
3321 | printk(KERN_WARNING "mbox_read: Illegal Command 0x%x\n", | 3407 | printk(KERN_WARNING "mbox_read: Illegal Command 0x%x\n", |
3322 | phba->sysfs_mbox.mbox->mb.mbxCommand); | 3408 | pmb->mbxCommand); |
3323 | sysfs_mbox_idle(phba); | 3409 | sysfs_mbox_idle(phba); |
3324 | spin_unlock_irq(&phba->hbalock); | 3410 | spin_unlock_irq(&phba->hbalock); |
3325 | return -EPERM; | 3411 | return -EPERM; |
3326 | default: | 3412 | default: |
3327 | printk(KERN_WARNING "mbox_read: Unknown Command 0x%x\n", | 3413 | printk(KERN_WARNING "mbox_read: Unknown Command 0x%x\n", |
3328 | phba->sysfs_mbox.mbox->mb.mbxCommand); | 3414 | pmb->mbxCommand); |
3329 | sysfs_mbox_idle(phba); | 3415 | sysfs_mbox_idle(phba); |
3330 | spin_unlock_irq(&phba->hbalock); | 3416 | spin_unlock_irq(&phba->hbalock); |
3331 | return -EPERM; | 3417 | return -EPERM; |
@@ -3335,14 +3421,14 @@ sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3335 | * or RESTART mailbox commands until the HBA is restarted. | 3421 | * or RESTART mailbox commands until the HBA is restarted. |
3336 | */ | 3422 | */ |
3337 | if (phba->pport->stopped && | 3423 | if (phba->pport->stopped && |
3338 | phba->sysfs_mbox.mbox->mb.mbxCommand != MBX_DUMP_MEMORY && | 3424 | pmb->mbxCommand != MBX_DUMP_MEMORY && |
3339 | phba->sysfs_mbox.mbox->mb.mbxCommand != MBX_RESTART && | 3425 | pmb->mbxCommand != MBX_RESTART && |
3340 | phba->sysfs_mbox.mbox->mb.mbxCommand != MBX_WRITE_VPARMS && | 3426 | pmb->mbxCommand != MBX_WRITE_VPARMS && |
3341 | phba->sysfs_mbox.mbox->mb.mbxCommand != MBX_WRITE_WWN) | 3427 | pmb->mbxCommand != MBX_WRITE_WWN) |
3342 | lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX, | 3428 | lpfc_printf_log(phba, KERN_WARNING, LOG_MBOX, |
3343 | "1259 mbox: Issued mailbox cmd " | 3429 | "1259 mbox: Issued mailbox cmd " |
3344 | "0x%x while in stopped state.\n", | 3430 | "0x%x while in stopped state.\n", |
3345 | phba->sysfs_mbox.mbox->mb.mbxCommand); | 3431 | pmb->mbxCommand); |
3346 | 3432 | ||
3347 | phba->sysfs_mbox.mbox->vport = vport; | 3433 | phba->sysfs_mbox.mbox->vport = vport; |
3348 | 3434 | ||
@@ -3356,7 +3442,7 @@ sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3356 | } | 3442 | } |
3357 | 3443 | ||
3358 | if ((vport->fc_flag & FC_OFFLINE_MODE) || | 3444 | if ((vport->fc_flag & FC_OFFLINE_MODE) || |
3359 | (!(phba->sli.sli_flag & LPFC_SLI2_ACTIVE))){ | 3445 | (!(phba->sli.sli_flag & LPFC_SLI_ACTIVE))) { |
3360 | 3446 | ||
3361 | spin_unlock_irq(&phba->hbalock); | 3447 | spin_unlock_irq(&phba->hbalock); |
3362 | rc = lpfc_sli_issue_mbox (phba, | 3448 | rc = lpfc_sli_issue_mbox (phba, |
@@ -3368,8 +3454,7 @@ sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3368 | spin_unlock_irq(&phba->hbalock); | 3454 | spin_unlock_irq(&phba->hbalock); |
3369 | rc = lpfc_sli_issue_mbox_wait (phba, | 3455 | rc = lpfc_sli_issue_mbox_wait (phba, |
3370 | phba->sysfs_mbox.mbox, | 3456 | phba->sysfs_mbox.mbox, |
3371 | lpfc_mbox_tmo_val(phba, | 3457 | lpfc_mbox_tmo_val(phba, pmb->mbxCommand) * HZ); |
3372 | phba->sysfs_mbox.mbox->mb.mbxCommand) * HZ); | ||
3373 | spin_lock_irq(&phba->hbalock); | 3458 | spin_lock_irq(&phba->hbalock); |
3374 | } | 3459 | } |
3375 | 3460 | ||
@@ -3391,7 +3476,7 @@ sysfs_mbox_read(struct kobject *kobj, struct bin_attribute *bin_attr, | |||
3391 | return -EAGAIN; | 3476 | return -EAGAIN; |
3392 | } | 3477 | } |
3393 | 3478 | ||
3394 | memcpy(buf, (uint8_t *) & phba->sysfs_mbox.mbox->mb + off, count); | 3479 | memcpy(buf, (uint8_t *) &pmb + off, count); |
3395 | 3480 | ||
3396 | phba->sysfs_mbox.offset = off + count; | 3481 | phba->sysfs_mbox.offset = off + count; |
3397 | 3482 | ||
@@ -3585,6 +3670,9 @@ lpfc_get_host_speed(struct Scsi_Host *shost) | |||
3585 | case LA_8GHZ_LINK: | 3670 | case LA_8GHZ_LINK: |
3586 | fc_host_speed(shost) = FC_PORTSPEED_8GBIT; | 3671 | fc_host_speed(shost) = FC_PORTSPEED_8GBIT; |
3587 | break; | 3672 | break; |
3673 | case LA_10GHZ_LINK: | ||
3674 | fc_host_speed(shost) = FC_PORTSPEED_10GBIT; | ||
3675 | break; | ||
3588 | default: | 3676 | default: |
3589 | fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN; | 3677 | fc_host_speed(shost) = FC_PORTSPEED_UNKNOWN; |
3590 | break; | 3678 | break; |
@@ -3652,7 +3740,7 @@ lpfc_get_stats(struct Scsi_Host *shost) | |||
3652 | */ | 3740 | */ |
3653 | if (phba->link_state < LPFC_LINK_DOWN || | 3741 | if (phba->link_state < LPFC_LINK_DOWN || |
3654 | !phba->mbox_mem_pool || | 3742 | !phba->mbox_mem_pool || |
3655 | (phba->sli.sli_flag & LPFC_SLI2_ACTIVE) == 0) | 3743 | (phba->sli.sli_flag & LPFC_SLI_ACTIVE) == 0) |
3656 | return NULL; | 3744 | return NULL; |
3657 | 3745 | ||
3658 | if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) | 3746 | if (phba->sli.sli_flag & LPFC_BLOCK_MGMT_IO) |
@@ -3663,14 +3751,14 @@ lpfc_get_stats(struct Scsi_Host *shost) | |||
3663 | return NULL; | 3751 | return NULL; |
3664 | memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t)); | 3752 | memset(pmboxq, 0, sizeof (LPFC_MBOXQ_t)); |
3665 | 3753 | ||
3666 | pmb = &pmboxq->mb; | 3754 | pmb = &pmboxq->u.mb; |
3667 | pmb->mbxCommand = MBX_READ_STATUS; | 3755 | pmb->mbxCommand = MBX_READ_STATUS; |
3668 | pmb->mbxOwner = OWN_HOST; | 3756 | pmb->mbxOwner = OWN_HOST; |
3669 | pmboxq->context1 = NULL; | 3757 | pmboxq->context1 = NULL; |
3670 | pmboxq->vport = vport; | 3758 | pmboxq->vport = vport; |
3671 | 3759 | ||
3672 | if ((vport->fc_flag & FC_OFFLINE_MODE) || | 3760 | if ((vport->fc_flag & FC_OFFLINE_MODE) || |
3673 | (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) | 3761 | (!(psli->sli_flag & LPFC_SLI_ACTIVE))) |
3674 | rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); | 3762 | rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); |
3675 | else | 3763 | else |
3676 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); | 3764 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); |
@@ -3695,7 +3783,7 @@ lpfc_get_stats(struct Scsi_Host *shost) | |||
3695 | pmboxq->vport = vport; | 3783 | pmboxq->vport = vport; |
3696 | 3784 | ||
3697 | if ((vport->fc_flag & FC_OFFLINE_MODE) || | 3785 | if ((vport->fc_flag & FC_OFFLINE_MODE) || |
3698 | (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) | 3786 | (!(psli->sli_flag & LPFC_SLI_ACTIVE))) |
3699 | rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); | 3787 | rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); |
3700 | else | 3788 | else |
3701 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); | 3789 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); |
@@ -3769,7 +3857,7 @@ lpfc_reset_stats(struct Scsi_Host *shost) | |||
3769 | return; | 3857 | return; |
3770 | memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t)); | 3858 | memset(pmboxq, 0, sizeof(LPFC_MBOXQ_t)); |
3771 | 3859 | ||
3772 | pmb = &pmboxq->mb; | 3860 | pmb = &pmboxq->u.mb; |
3773 | pmb->mbxCommand = MBX_READ_STATUS; | 3861 | pmb->mbxCommand = MBX_READ_STATUS; |
3774 | pmb->mbxOwner = OWN_HOST; | 3862 | pmb->mbxOwner = OWN_HOST; |
3775 | pmb->un.varWords[0] = 0x1; /* reset request */ | 3863 | pmb->un.varWords[0] = 0x1; /* reset request */ |
@@ -3777,7 +3865,7 @@ lpfc_reset_stats(struct Scsi_Host *shost) | |||
3777 | pmboxq->vport = vport; | 3865 | pmboxq->vport = vport; |
3778 | 3866 | ||
3779 | if ((vport->fc_flag & FC_OFFLINE_MODE) || | 3867 | if ((vport->fc_flag & FC_OFFLINE_MODE) || |
3780 | (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) | 3868 | (!(psli->sli_flag & LPFC_SLI_ACTIVE))) |
3781 | rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); | 3869 | rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); |
3782 | else | 3870 | else |
3783 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); | 3871 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); |
@@ -3795,7 +3883,7 @@ lpfc_reset_stats(struct Scsi_Host *shost) | |||
3795 | pmboxq->vport = vport; | 3883 | pmboxq->vport = vport; |
3796 | 3884 | ||
3797 | if ((vport->fc_flag & FC_OFFLINE_MODE) || | 3885 | if ((vport->fc_flag & FC_OFFLINE_MODE) || |
3798 | (!(psli->sli_flag & LPFC_SLI2_ACTIVE))) | 3886 | (!(psli->sli_flag & LPFC_SLI_ACTIVE))) |
3799 | rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); | 3887 | rc = lpfc_sli_issue_mbox(phba, pmboxq, MBX_POLL); |
3800 | else | 3888 | else |
3801 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); | 3889 | rc = lpfc_sli_issue_mbox_wait(phba, pmboxq, phba->fc_ratov * 2); |
@@ -3962,6 +4050,21 @@ lpfc_set_vport_symbolic_name(struct fc_vport *fc_vport) | |||
3962 | lpfc_ns_cmd(vport, SLI_CTNS_RSPN_ID, 0, 0); | 4050 | lpfc_ns_cmd(vport, SLI_CTNS_RSPN_ID, 0, 0); |
3963 | } | 4051 | } |
3964 | 4052 | ||
4053 | /** | ||
4054 | * lpfc_hba_log_verbose_init - Set hba's log verbose level | ||
4055 | * @phba: Pointer to lpfc_hba struct. | ||
4056 | * | ||
4057 | * This function is called by the lpfc_get_cfgparam() routine to set the | ||
4058 | * module lpfc_log_verbose into the @phba cfg_log_verbose for use with | ||
4059 | * log messsage according to the module's lpfc_log_verbose parameter setting | ||
4060 | * before hba port or vport created. | ||
4061 | **/ | ||
4062 | static void | ||
4063 | lpfc_hba_log_verbose_init(struct lpfc_hba *phba, uint32_t verbose) | ||
4064 | { | ||
4065 | phba->cfg_log_verbose = verbose; | ||
4066 | } | ||
4067 | |||
3965 | struct fc_function_template lpfc_transport_functions = { | 4068 | struct fc_function_template lpfc_transport_functions = { |
3966 | /* fixed attributes the driver supports */ | 4069 | /* fixed attributes the driver supports */ |
3967 | .show_host_node_name = 1, | 4070 | .show_host_node_name = 1, |
@@ -4105,6 +4208,9 @@ lpfc_get_cfgparam(struct lpfc_hba *phba) | |||
4105 | lpfc_poll_tmo_init(phba, lpfc_poll_tmo); | 4208 | lpfc_poll_tmo_init(phba, lpfc_poll_tmo); |
4106 | lpfc_enable_npiv_init(phba, lpfc_enable_npiv); | 4209 | lpfc_enable_npiv_init(phba, lpfc_enable_npiv); |
4107 | lpfc_use_msi_init(phba, lpfc_use_msi); | 4210 | lpfc_use_msi_init(phba, lpfc_use_msi); |
4211 | lpfc_fcp_imax_init(phba, lpfc_fcp_imax); | ||
4212 | lpfc_fcp_wq_count_init(phba, lpfc_fcp_wq_count); | ||
4213 | lpfc_fcp_eq_count_init(phba, lpfc_fcp_eq_count); | ||
4108 | lpfc_enable_hba_reset_init(phba, lpfc_enable_hba_reset); | 4214 | lpfc_enable_hba_reset_init(phba, lpfc_enable_hba_reset); |
4109 | lpfc_enable_hba_heartbeat_init(phba, lpfc_enable_hba_heartbeat); | 4215 | lpfc_enable_hba_heartbeat_init(phba, lpfc_enable_hba_heartbeat); |
4110 | lpfc_enable_bg_init(phba, lpfc_enable_bg); | 4216 | lpfc_enable_bg_init(phba, lpfc_enable_bg); |
@@ -4113,26 +4219,10 @@ lpfc_get_cfgparam(struct lpfc_hba *phba) | |||
4113 | phba->cfg_soft_wwpn = 0L; | 4219 | phba->cfg_soft_wwpn = 0L; |
4114 | lpfc_sg_seg_cnt_init(phba, lpfc_sg_seg_cnt); | 4220 | lpfc_sg_seg_cnt_init(phba, lpfc_sg_seg_cnt); |
4115 | lpfc_prot_sg_seg_cnt_init(phba, lpfc_prot_sg_seg_cnt); | 4221 | lpfc_prot_sg_seg_cnt_init(phba, lpfc_prot_sg_seg_cnt); |
4116 | /* | ||
4117 | * Since the sg_tablesize is module parameter, the sg_dma_buf_size | ||
4118 | * used to create the sg_dma_buf_pool must be dynamically calculated. | ||
4119 | * 2 segments are added since the IOCB needs a command and response bde. | ||
4120 | */ | ||
4121 | phba->cfg_sg_dma_buf_size = sizeof(struct fcp_cmnd) + | ||
4122 | sizeof(struct fcp_rsp) + | ||
4123 | ((phba->cfg_sg_seg_cnt + 2) * sizeof(struct ulp_bde64)); | ||
4124 | |||
4125 | if (phba->cfg_enable_bg) { | ||
4126 | phba->cfg_sg_seg_cnt = LPFC_MAX_SG_SEG_CNT; | ||
4127 | phba->cfg_sg_dma_buf_size += | ||
4128 | phba->cfg_prot_sg_seg_cnt * sizeof(struct ulp_bde64); | ||
4129 | } | ||
4130 | |||
4131 | /* Also reinitialize the host templates with new values. */ | ||
4132 | lpfc_vport_template.sg_tablesize = phba->cfg_sg_seg_cnt; | ||
4133 | lpfc_template.sg_tablesize = phba->cfg_sg_seg_cnt; | ||
4134 | |||
4135 | lpfc_hba_queue_depth_init(phba, lpfc_hba_queue_depth); | 4222 | lpfc_hba_queue_depth_init(phba, lpfc_hba_queue_depth); |
4223 | lpfc_enable_fip_init(phba, lpfc_enable_fip); | ||
4224 | lpfc_hba_log_verbose_init(phba, lpfc_log_verbose); | ||
4225 | |||
4136 | return; | 4226 | return; |
4137 | } | 4227 | } |
4138 | 4228 | ||