diff options
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_compat.h | 5 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_debugfs.c | 172 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_init.c | 164 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_mem.c | 4 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_sli.c | 135 | ||||
| -rw-r--r-- | drivers/scsi/lpfc/lpfc_sli4.h | 9 |
6 files changed, 350 insertions, 139 deletions
diff --git a/drivers/scsi/lpfc/lpfc_compat.h b/drivers/scsi/lpfc/lpfc_compat.h index 75e2e569dede..c88e556ea62e 100644 --- a/drivers/scsi/lpfc/lpfc_compat.h +++ b/drivers/scsi/lpfc/lpfc_compat.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-2005 Emulex. All rights reserved. * | 4 | * Copyright (C) 2004-2011 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 | * * |
| @@ -82,7 +82,8 @@ lpfc_memcpy_from_slim( void *dest, void __iomem *src, unsigned int bytes) | |||
| 82 | static inline void | 82 | static inline void |
| 83 | lpfc_memcpy_to_slim( void __iomem *dest, void *src, unsigned int bytes) | 83 | lpfc_memcpy_to_slim( void __iomem *dest, void *src, unsigned int bytes) |
| 84 | { | 84 | { |
| 85 | __iowrite32_copy(dest, src, bytes); | 85 | /* convert bytes in argument list to word count for copy function */ |
| 86 | __iowrite32_copy(dest, src, bytes / sizeof(uint32_t)); | ||
| 86 | } | 87 | } |
| 87 | 88 | ||
| 88 | static inline void | 89 | static inline void |
diff --git a/drivers/scsi/lpfc/lpfc_debugfs.c b/drivers/scsi/lpfc/lpfc_debugfs.c index 28382596fb9a..3587a3fe8fcb 100644 --- a/drivers/scsi/lpfc/lpfc_debugfs.c +++ b/drivers/scsi/lpfc/lpfc_debugfs.c | |||
| @@ -1997,7 +1997,8 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 1997 | /* Get slow-path event queue information */ | 1997 | /* Get slow-path event queue information */ |
| 1998 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 1998 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 1999 | "Slow-path EQ information:\n"); | 1999 | "Slow-path EQ information:\n"); |
| 2000 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2000 | if (phba->sli4_hba.sp_eq) { |
| 2001 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2001 | "\tEQID[%02d], " | 2002 | "\tEQID[%02d], " |
| 2002 | "QE-COUNT[%04d], QE-SIZE[%04d], " | 2003 | "QE-COUNT[%04d], QE-SIZE[%04d], " |
| 2003 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", | 2004 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", |
| @@ -2006,12 +2007,17 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2006 | phba->sli4_hba.sp_eq->entry_size, | 2007 | phba->sli4_hba.sp_eq->entry_size, |
| 2007 | phba->sli4_hba.sp_eq->host_index, | 2008 | phba->sli4_hba.sp_eq->host_index, |
| 2008 | phba->sli4_hba.sp_eq->hba_index); | 2009 | phba->sli4_hba.sp_eq->hba_index); |
| 2010 | } | ||
| 2009 | 2011 | ||
| 2010 | /* Get fast-path event queue information */ | 2012 | /* Get fast-path event queue information */ |
| 2011 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2013 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2012 | "Fast-path EQ information:\n"); | 2014 | "Fast-path EQ information:\n"); |
| 2013 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; fcp_qidx++) { | 2015 | if (phba->sli4_hba.fp_eq) { |
| 2014 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2016 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; |
| 2017 | fcp_qidx++) { | ||
| 2018 | if (phba->sli4_hba.fp_eq[fcp_qidx]) { | ||
| 2019 | len += snprintf(pbuffer+len, | ||
| 2020 | LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2015 | "\tEQID[%02d], " | 2021 | "\tEQID[%02d], " |
| 2016 | "QE-COUNT[%04d], QE-SIZE[%04d], " | 2022 | "QE-COUNT[%04d], QE-SIZE[%04d], " |
| 2017 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", | 2023 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", |
| @@ -2020,16 +2026,19 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2020 | phba->sli4_hba.fp_eq[fcp_qidx]->entry_size, | 2026 | phba->sli4_hba.fp_eq[fcp_qidx]->entry_size, |
| 2021 | phba->sli4_hba.fp_eq[fcp_qidx]->host_index, | 2027 | phba->sli4_hba.fp_eq[fcp_qidx]->host_index, |
| 2022 | phba->sli4_hba.fp_eq[fcp_qidx]->hba_index); | 2028 | phba->sli4_hba.fp_eq[fcp_qidx]->hba_index); |
| 2029 | } | ||
| 2030 | } | ||
| 2023 | } | 2031 | } |
| 2024 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n"); | 2032 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n"); |
| 2025 | 2033 | ||
| 2026 | /* Get mailbox complete queue information */ | 2034 | /* Get mailbox complete queue information */ |
| 2027 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2035 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2028 | "Slow-path MBX CQ information:\n"); | 2036 | "Slow-path MBX CQ information:\n"); |
| 2029 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2037 | if (phba->sli4_hba.mbx_cq) { |
| 2038 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2030 | "Associated EQID[%02d]:\n", | 2039 | "Associated EQID[%02d]:\n", |
| 2031 | phba->sli4_hba.mbx_cq->assoc_qid); | 2040 | phba->sli4_hba.mbx_cq->assoc_qid); |
| 2032 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2041 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2033 | "\tCQID[%02d], " | 2042 | "\tCQID[%02d], " |
| 2034 | "QE-COUNT[%04d], QE-SIZE[%04d], " | 2043 | "QE-COUNT[%04d], QE-SIZE[%04d], " |
| 2035 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", | 2044 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", |
| @@ -2038,14 +2047,16 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2038 | phba->sli4_hba.mbx_cq->entry_size, | 2047 | phba->sli4_hba.mbx_cq->entry_size, |
| 2039 | phba->sli4_hba.mbx_cq->host_index, | 2048 | phba->sli4_hba.mbx_cq->host_index, |
| 2040 | phba->sli4_hba.mbx_cq->hba_index); | 2049 | phba->sli4_hba.mbx_cq->hba_index); |
| 2050 | } | ||
| 2041 | 2051 | ||
| 2042 | /* Get slow-path complete queue information */ | 2052 | /* Get slow-path complete queue information */ |
| 2043 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2053 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2044 | "Slow-path ELS CQ information:\n"); | 2054 | "Slow-path ELS CQ information:\n"); |
| 2045 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2055 | if (phba->sli4_hba.els_cq) { |
| 2056 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2046 | "Associated EQID[%02d]:\n", | 2057 | "Associated EQID[%02d]:\n", |
| 2047 | phba->sli4_hba.els_cq->assoc_qid); | 2058 | phba->sli4_hba.els_cq->assoc_qid); |
| 2048 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2059 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2049 | "\tCQID [%02d], " | 2060 | "\tCQID [%02d], " |
| 2050 | "QE-COUNT[%04d], QE-SIZE[%04d], " | 2061 | "QE-COUNT[%04d], QE-SIZE[%04d], " |
| 2051 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", | 2062 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", |
| @@ -2054,16 +2065,21 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2054 | phba->sli4_hba.els_cq->entry_size, | 2065 | phba->sli4_hba.els_cq->entry_size, |
| 2055 | phba->sli4_hba.els_cq->host_index, | 2066 | phba->sli4_hba.els_cq->host_index, |
| 2056 | phba->sli4_hba.els_cq->hba_index); | 2067 | phba->sli4_hba.els_cq->hba_index); |
| 2068 | } | ||
| 2057 | 2069 | ||
| 2058 | /* Get fast-path complete queue information */ | 2070 | /* Get fast-path complete queue information */ |
| 2059 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2071 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2060 | "Fast-path FCP CQ information:\n"); | 2072 | "Fast-path FCP CQ information:\n"); |
| 2061 | fcp_qidx = 0; | 2073 | fcp_qidx = 0; |
| 2062 | do { | 2074 | if (phba->sli4_hba.fcp_cq) { |
| 2063 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2075 | do { |
| 2076 | if (phba->sli4_hba.fcp_cq[fcp_qidx]) { | ||
| 2077 | len += snprintf(pbuffer+len, | ||
| 2078 | LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2064 | "Associated EQID[%02d]:\n", | 2079 | "Associated EQID[%02d]:\n", |
| 2065 | phba->sli4_hba.fcp_cq[fcp_qidx]->assoc_qid); | 2080 | phba->sli4_hba.fcp_cq[fcp_qidx]->assoc_qid); |
| 2066 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2081 | len += snprintf(pbuffer+len, |
| 2082 | LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2067 | "\tCQID[%02d], " | 2083 | "\tCQID[%02d], " |
| 2068 | "QE-COUNT[%04d], QE-SIZE[%04d], " | 2084 | "QE-COUNT[%04d], QE-SIZE[%04d], " |
| 2069 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", | 2085 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", |
| @@ -2072,16 +2088,20 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2072 | phba->sli4_hba.fcp_cq[fcp_qidx]->entry_size, | 2088 | phba->sli4_hba.fcp_cq[fcp_qidx]->entry_size, |
| 2073 | phba->sli4_hba.fcp_cq[fcp_qidx]->host_index, | 2089 | phba->sli4_hba.fcp_cq[fcp_qidx]->host_index, |
| 2074 | phba->sli4_hba.fcp_cq[fcp_qidx]->hba_index); | 2090 | phba->sli4_hba.fcp_cq[fcp_qidx]->hba_index); |
| 2075 | } while (++fcp_qidx < phba->cfg_fcp_eq_count); | 2091 | } |
| 2076 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n"); | 2092 | } while (++fcp_qidx < phba->cfg_fcp_eq_count); |
| 2093 | len += snprintf(pbuffer+len, | ||
| 2094 | LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n"); | ||
| 2095 | } | ||
| 2077 | 2096 | ||
| 2078 | /* Get mailbox queue information */ | 2097 | /* Get mailbox queue information */ |
| 2079 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2098 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2080 | "Slow-path MBX MQ information:\n"); | 2099 | "Slow-path MBX MQ information:\n"); |
| 2081 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2100 | if (phba->sli4_hba.mbx_wq) { |
| 2101 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2082 | "Associated CQID[%02d]:\n", | 2102 | "Associated CQID[%02d]:\n", |
| 2083 | phba->sli4_hba.mbx_wq->assoc_qid); | 2103 | phba->sli4_hba.mbx_wq->assoc_qid); |
| 2084 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2104 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2085 | "\tWQID[%02d], " | 2105 | "\tWQID[%02d], " |
| 2086 | "QE-COUNT[%04d], QE-SIZE[%04d], " | 2106 | "QE-COUNT[%04d], QE-SIZE[%04d], " |
| 2087 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", | 2107 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", |
| @@ -2090,14 +2110,16 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2090 | phba->sli4_hba.mbx_wq->entry_size, | 2110 | phba->sli4_hba.mbx_wq->entry_size, |
| 2091 | phba->sli4_hba.mbx_wq->host_index, | 2111 | phba->sli4_hba.mbx_wq->host_index, |
| 2092 | phba->sli4_hba.mbx_wq->hba_index); | 2112 | phba->sli4_hba.mbx_wq->hba_index); |
| 2113 | } | ||
| 2093 | 2114 | ||
| 2094 | /* Get slow-path work queue information */ | 2115 | /* Get slow-path work queue information */ |
| 2095 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2116 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2096 | "Slow-path ELS WQ information:\n"); | 2117 | "Slow-path ELS WQ information:\n"); |
| 2097 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2118 | if (phba->sli4_hba.els_wq) { |
| 2119 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2098 | "Associated CQID[%02d]:\n", | 2120 | "Associated CQID[%02d]:\n", |
| 2099 | phba->sli4_hba.els_wq->assoc_qid); | 2121 | phba->sli4_hba.els_wq->assoc_qid); |
| 2100 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2122 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2101 | "\tWQID[%02d], " | 2123 | "\tWQID[%02d], " |
| 2102 | "QE-COUNT[%04d], QE-SIZE[%04d], " | 2124 | "QE-COUNT[%04d], QE-SIZE[%04d], " |
| 2103 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", | 2125 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n\n", |
| @@ -2106,15 +2128,22 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2106 | phba->sli4_hba.els_wq->entry_size, | 2128 | phba->sli4_hba.els_wq->entry_size, |
| 2107 | phba->sli4_hba.els_wq->host_index, | 2129 | phba->sli4_hba.els_wq->host_index, |
| 2108 | phba->sli4_hba.els_wq->hba_index); | 2130 | phba->sli4_hba.els_wq->hba_index); |
| 2131 | } | ||
| 2109 | 2132 | ||
| 2110 | /* Get fast-path work queue information */ | 2133 | /* Get fast-path work queue information */ |
| 2111 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2134 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2112 | "Fast-path FCP WQ information:\n"); | 2135 | "Fast-path FCP WQ information:\n"); |
| 2113 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_wq_count; fcp_qidx++) { | 2136 | if (phba->sli4_hba.fcp_wq) { |
| 2114 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2137 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_wq_count; |
| 2138 | fcp_qidx++) { | ||
| 2139 | if (!phba->sli4_hba.fcp_wq[fcp_qidx]) | ||
| 2140 | continue; | ||
| 2141 | len += snprintf(pbuffer+len, | ||
| 2142 | LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2115 | "Associated CQID[%02d]:\n", | 2143 | "Associated CQID[%02d]:\n", |
| 2116 | phba->sli4_hba.fcp_wq[fcp_qidx]->assoc_qid); | 2144 | phba->sli4_hba.fcp_wq[fcp_qidx]->assoc_qid); |
| 2117 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2145 | len += snprintf(pbuffer+len, |
| 2146 | LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2118 | "\tWQID[%02d], " | 2147 | "\tWQID[%02d], " |
| 2119 | "QE-COUNT[%04d], WQE-SIZE[%04d], " | 2148 | "QE-COUNT[%04d], WQE-SIZE[%04d], " |
| 2120 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", | 2149 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", |
| @@ -2123,16 +2152,19 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2123 | phba->sli4_hba.fcp_wq[fcp_qidx]->entry_size, | 2152 | phba->sli4_hba.fcp_wq[fcp_qidx]->entry_size, |
| 2124 | phba->sli4_hba.fcp_wq[fcp_qidx]->host_index, | 2153 | phba->sli4_hba.fcp_wq[fcp_qidx]->host_index, |
| 2125 | phba->sli4_hba.fcp_wq[fcp_qidx]->hba_index); | 2154 | phba->sli4_hba.fcp_wq[fcp_qidx]->hba_index); |
| 2155 | } | ||
| 2156 | len += snprintf(pbuffer+len, | ||
| 2157 | LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n"); | ||
| 2126 | } | 2158 | } |
| 2127 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, "\n"); | ||
| 2128 | 2159 | ||
| 2129 | /* Get receive queue information */ | 2160 | /* Get receive queue information */ |
| 2130 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2161 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2131 | "Slow-path RQ information:\n"); | 2162 | "Slow-path RQ information:\n"); |
| 2132 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2163 | if (phba->sli4_hba.hdr_rq && phba->sli4_hba.dat_rq) { |
| 2164 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | ||
| 2133 | "Associated CQID[%02d]:\n", | 2165 | "Associated CQID[%02d]:\n", |
| 2134 | phba->sli4_hba.hdr_rq->assoc_qid); | 2166 | phba->sli4_hba.hdr_rq->assoc_qid); |
| 2135 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2167 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2136 | "\tHQID[%02d], " | 2168 | "\tHQID[%02d], " |
| 2137 | "QE-COUNT[%04d], QE-SIZE[%04d], " | 2169 | "QE-COUNT[%04d], QE-SIZE[%04d], " |
| 2138 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", | 2170 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", |
| @@ -2141,7 +2173,7 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2141 | phba->sli4_hba.hdr_rq->entry_size, | 2173 | phba->sli4_hba.hdr_rq->entry_size, |
| 2142 | phba->sli4_hba.hdr_rq->host_index, | 2174 | phba->sli4_hba.hdr_rq->host_index, |
| 2143 | phba->sli4_hba.hdr_rq->hba_index); | 2175 | phba->sli4_hba.hdr_rq->hba_index); |
| 2144 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, | 2176 | len += snprintf(pbuffer+len, LPFC_QUE_INFO_GET_BUF_SIZE-len, |
| 2145 | "\tDQID[%02d], " | 2177 | "\tDQID[%02d], " |
| 2146 | "QE-COUNT[%04d], QE-SIZE[%04d], " | 2178 | "QE-COUNT[%04d], QE-SIZE[%04d], " |
| 2147 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", | 2179 | "HOST-INDEX[%04d], PORT-INDEX[%04d]\n", |
| @@ -2150,7 +2182,7 @@ lpfc_idiag_queinfo_read(struct file *file, char __user *buf, size_t nbytes, | |||
| 2150 | phba->sli4_hba.dat_rq->entry_size, | 2182 | phba->sli4_hba.dat_rq->entry_size, |
| 2151 | phba->sli4_hba.dat_rq->host_index, | 2183 | phba->sli4_hba.dat_rq->host_index, |
| 2152 | phba->sli4_hba.dat_rq->hba_index); | 2184 | phba->sli4_hba.dat_rq->hba_index); |
| 2153 | 2185 | } | |
| 2154 | return simple_read_from_buffer(buf, nbytes, ppos, pbuffer, len); | 2186 | return simple_read_from_buffer(buf, nbytes, ppos, pbuffer, len); |
| 2155 | } | 2187 | } |
| 2156 | 2188 | ||
| @@ -2360,7 +2392,8 @@ lpfc_idiag_queacc_write(struct file *file, const char __user *buf, | |||
| 2360 | switch (quetp) { | 2392 | switch (quetp) { |
| 2361 | case LPFC_IDIAG_EQ: | 2393 | case LPFC_IDIAG_EQ: |
| 2362 | /* Slow-path event queue */ | 2394 | /* Slow-path event queue */ |
| 2363 | if (phba->sli4_hba.sp_eq->queue_id == queid) { | 2395 | if (phba->sli4_hba.sp_eq && |
| 2396 | phba->sli4_hba.sp_eq->queue_id == queid) { | ||
| 2364 | /* Sanity check */ | 2397 | /* Sanity check */ |
| 2365 | rc = lpfc_idiag_que_param_check( | 2398 | rc = lpfc_idiag_que_param_check( |
| 2366 | phba->sli4_hba.sp_eq, index, count); | 2399 | phba->sli4_hba.sp_eq, index, count); |
| @@ -2370,23 +2403,29 @@ lpfc_idiag_queacc_write(struct file *file, const char __user *buf, | |||
| 2370 | goto pass_check; | 2403 | goto pass_check; |
| 2371 | } | 2404 | } |
| 2372 | /* Fast-path event queue */ | 2405 | /* Fast-path event queue */ |
| 2373 | for (qidx = 0; qidx < phba->cfg_fcp_eq_count; qidx++) { | 2406 | if (phba->sli4_hba.fp_eq) { |
| 2374 | if (phba->sli4_hba.fp_eq[qidx]->queue_id == queid) { | 2407 | for (qidx = 0; qidx < phba->cfg_fcp_eq_count; qidx++) { |
| 2375 | /* Sanity check */ | 2408 | if (phba->sli4_hba.fp_eq[qidx] && |
| 2376 | rc = lpfc_idiag_que_param_check( | 2409 | phba->sli4_hba.fp_eq[qidx]->queue_id == |
| 2410 | queid) { | ||
| 2411 | /* Sanity check */ | ||
| 2412 | rc = lpfc_idiag_que_param_check( | ||
| 2377 | phba->sli4_hba.fp_eq[qidx], | 2413 | phba->sli4_hba.fp_eq[qidx], |
| 2378 | index, count); | 2414 | index, count); |
| 2379 | if (rc) | 2415 | if (rc) |
| 2380 | goto error_out; | 2416 | goto error_out; |
| 2381 | idiag.ptr_private = phba->sli4_hba.fp_eq[qidx]; | 2417 | idiag.ptr_private = |
| 2382 | goto pass_check; | 2418 | phba->sli4_hba.fp_eq[qidx]; |
| 2419 | goto pass_check; | ||
| 2420 | } | ||
| 2383 | } | 2421 | } |
| 2384 | } | 2422 | } |
| 2385 | goto error_out; | 2423 | goto error_out; |
| 2386 | break; | 2424 | break; |
| 2387 | case LPFC_IDIAG_CQ: | 2425 | case LPFC_IDIAG_CQ: |
| 2388 | /* MBX complete queue */ | 2426 | /* MBX complete queue */ |
| 2389 | if (phba->sli4_hba.mbx_cq->queue_id == queid) { | 2427 | if (phba->sli4_hba.mbx_cq && |
| 2428 | phba->sli4_hba.mbx_cq->queue_id == queid) { | ||
| 2390 | /* Sanity check */ | 2429 | /* Sanity check */ |
| 2391 | rc = lpfc_idiag_que_param_check( | 2430 | rc = lpfc_idiag_que_param_check( |
| 2392 | phba->sli4_hba.mbx_cq, index, count); | 2431 | phba->sli4_hba.mbx_cq, index, count); |
| @@ -2396,7 +2435,8 @@ lpfc_idiag_queacc_write(struct file *file, const char __user *buf, | |||
| 2396 | goto pass_check; | 2435 | goto pass_check; |
| 2397 | } | 2436 | } |
| 2398 | /* ELS complete queue */ | 2437 | /* ELS complete queue */ |
| 2399 | if (phba->sli4_hba.els_cq->queue_id == queid) { | 2438 | if (phba->sli4_hba.els_cq && |
| 2439 | phba->sli4_hba.els_cq->queue_id == queid) { | ||
| 2400 | /* Sanity check */ | 2440 | /* Sanity check */ |
| 2401 | rc = lpfc_idiag_que_param_check( | 2441 | rc = lpfc_idiag_que_param_check( |
| 2402 | phba->sli4_hba.els_cq, index, count); | 2442 | phba->sli4_hba.els_cq, index, count); |
| @@ -2406,25 +2446,30 @@ lpfc_idiag_queacc_write(struct file *file, const char __user *buf, | |||
| 2406 | goto pass_check; | 2446 | goto pass_check; |
| 2407 | } | 2447 | } |
| 2408 | /* FCP complete queue */ | 2448 | /* FCP complete queue */ |
| 2409 | qidx = 0; | 2449 | if (phba->sli4_hba.fcp_cq) { |
| 2410 | do { | 2450 | qidx = 0; |
| 2411 | if (phba->sli4_hba.fcp_cq[qidx]->queue_id == queid) { | 2451 | do { |
| 2412 | /* Sanity check */ | 2452 | if (phba->sli4_hba.fcp_cq[qidx] && |
| 2413 | rc = lpfc_idiag_que_param_check( | 2453 | phba->sli4_hba.fcp_cq[qidx]->queue_id == |
| 2454 | queid) { | ||
| 2455 | /* Sanity check */ | ||
| 2456 | rc = lpfc_idiag_que_param_check( | ||
| 2414 | phba->sli4_hba.fcp_cq[qidx], | 2457 | phba->sli4_hba.fcp_cq[qidx], |
| 2415 | index, count); | 2458 | index, count); |
| 2416 | if (rc) | 2459 | if (rc) |
| 2417 | goto error_out; | 2460 | goto error_out; |
| 2418 | idiag.ptr_private = | 2461 | idiag.ptr_private = |
| 2419 | phba->sli4_hba.fcp_cq[qidx]; | 2462 | phba->sli4_hba.fcp_cq[qidx]; |
| 2420 | goto pass_check; | 2463 | goto pass_check; |
| 2421 | } | 2464 | } |
| 2422 | } while (++qidx < phba->cfg_fcp_eq_count); | 2465 | } while (++qidx < phba->cfg_fcp_eq_count); |
| 2466 | } | ||
| 2423 | goto error_out; | 2467 | goto error_out; |
| 2424 | break; | 2468 | break; |
| 2425 | case LPFC_IDIAG_MQ: | 2469 | case LPFC_IDIAG_MQ: |
| 2426 | /* MBX work queue */ | 2470 | /* MBX work queue */ |
| 2427 | if (phba->sli4_hba.mbx_wq->queue_id == queid) { | 2471 | if (phba->sli4_hba.mbx_wq && |
| 2472 | phba->sli4_hba.mbx_wq->queue_id == queid) { | ||
| 2428 | /* Sanity check */ | 2473 | /* Sanity check */ |
| 2429 | rc = lpfc_idiag_que_param_check( | 2474 | rc = lpfc_idiag_que_param_check( |
| 2430 | phba->sli4_hba.mbx_wq, index, count); | 2475 | phba->sli4_hba.mbx_wq, index, count); |
| @@ -2433,10 +2478,12 @@ lpfc_idiag_queacc_write(struct file *file, const char __user *buf, | |||
| 2433 | idiag.ptr_private = phba->sli4_hba.mbx_wq; | 2478 | idiag.ptr_private = phba->sli4_hba.mbx_wq; |
| 2434 | goto pass_check; | 2479 | goto pass_check; |
| 2435 | } | 2480 | } |
| 2481 | goto error_out; | ||
| 2436 | break; | 2482 | break; |
| 2437 | case LPFC_IDIAG_WQ: | 2483 | case LPFC_IDIAG_WQ: |
| 2438 | /* ELS work queue */ | 2484 | /* ELS work queue */ |
| 2439 | if (phba->sli4_hba.els_wq->queue_id == queid) { | 2485 | if (phba->sli4_hba.els_wq && |
| 2486 | phba->sli4_hba.els_wq->queue_id == queid) { | ||
| 2440 | /* Sanity check */ | 2487 | /* Sanity check */ |
| 2441 | rc = lpfc_idiag_que_param_check( | 2488 | rc = lpfc_idiag_que_param_check( |
| 2442 | phba->sli4_hba.els_wq, index, count); | 2489 | phba->sli4_hba.els_wq, index, count); |
| @@ -2446,24 +2493,30 @@ lpfc_idiag_queacc_write(struct file *file, const char __user *buf, | |||
| 2446 | goto pass_check; | 2493 | goto pass_check; |
| 2447 | } | 2494 | } |
| 2448 | /* FCP work queue */ | 2495 | /* FCP work queue */ |
| 2449 | for (qidx = 0; qidx < phba->cfg_fcp_wq_count; qidx++) { | 2496 | if (phba->sli4_hba.fcp_wq) { |
| 2450 | if (phba->sli4_hba.fcp_wq[qidx]->queue_id == queid) { | 2497 | for (qidx = 0; qidx < phba->cfg_fcp_wq_count; qidx++) { |
| 2451 | /* Sanity check */ | 2498 | if (!phba->sli4_hba.fcp_wq[qidx]) |
| 2452 | rc = lpfc_idiag_que_param_check( | 2499 | continue; |
| 2500 | if (phba->sli4_hba.fcp_wq[qidx]->queue_id == | ||
| 2501 | queid) { | ||
| 2502 | /* Sanity check */ | ||
| 2503 | rc = lpfc_idiag_que_param_check( | ||
| 2453 | phba->sli4_hba.fcp_wq[qidx], | 2504 | phba->sli4_hba.fcp_wq[qidx], |
| 2454 | index, count); | 2505 | index, count); |
| 2455 | if (rc) | 2506 | if (rc) |
| 2456 | goto error_out; | 2507 | goto error_out; |
| 2457 | idiag.ptr_private = | 2508 | idiag.ptr_private = |
| 2458 | phba->sli4_hba.fcp_wq[qidx]; | 2509 | phba->sli4_hba.fcp_wq[qidx]; |
| 2459 | goto pass_check; | 2510 | goto pass_check; |
| 2511 | } | ||
| 2460 | } | 2512 | } |
| 2461 | } | 2513 | } |
| 2462 | goto error_out; | 2514 | goto error_out; |
| 2463 | break; | 2515 | break; |
| 2464 | case LPFC_IDIAG_RQ: | 2516 | case LPFC_IDIAG_RQ: |
| 2465 | /* HDR queue */ | 2517 | /* HDR queue */ |
| 2466 | if (phba->sli4_hba.hdr_rq->queue_id == queid) { | 2518 | if (phba->sli4_hba.hdr_rq && |
| 2519 | phba->sli4_hba.hdr_rq->queue_id == queid) { | ||
| 2467 | /* Sanity check */ | 2520 | /* Sanity check */ |
| 2468 | rc = lpfc_idiag_que_param_check( | 2521 | rc = lpfc_idiag_que_param_check( |
| 2469 | phba->sli4_hba.hdr_rq, index, count); | 2522 | phba->sli4_hba.hdr_rq, index, count); |
| @@ -2473,7 +2526,8 @@ lpfc_idiag_queacc_write(struct file *file, const char __user *buf, | |||
| 2473 | goto pass_check; | 2526 | goto pass_check; |
| 2474 | } | 2527 | } |
| 2475 | /* DAT queue */ | 2528 | /* DAT queue */ |
| 2476 | if (phba->sli4_hba.dat_rq->queue_id == queid) { | 2529 | if (phba->sli4_hba.dat_rq && |
| 2530 | phba->sli4_hba.dat_rq->queue_id == queid) { | ||
| 2477 | /* Sanity check */ | 2531 | /* Sanity check */ |
| 2478 | rc = lpfc_idiag_que_param_check( | 2532 | rc = lpfc_idiag_que_param_check( |
| 2479 | phba->sli4_hba.dat_rq, index, count); | 2533 | phba->sli4_hba.dat_rq, index, count); |
diff --git a/drivers/scsi/lpfc/lpfc_init.c b/drivers/scsi/lpfc/lpfc_init.c index 6096c9a091d1..cb714d2342d4 100644 --- a/drivers/scsi/lpfc/lpfc_init.c +++ b/drivers/scsi/lpfc/lpfc_init.c | |||
| @@ -1417,7 +1417,10 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba) | |||
| 1417 | uint32_t event_data; | 1417 | uint32_t event_data; |
| 1418 | struct Scsi_Host *shost; | 1418 | struct Scsi_Host *shost; |
| 1419 | uint32_t if_type; | 1419 | uint32_t if_type; |
| 1420 | struct lpfc_register portstat_reg; | 1420 | struct lpfc_register portstat_reg = {0}; |
| 1421 | uint32_t reg_err1, reg_err2; | ||
| 1422 | uint32_t uerrlo_reg, uemasklo_reg; | ||
| 1423 | uint32_t pci_rd_rc1, pci_rd_rc2; | ||
| 1421 | int rc; | 1424 | int rc; |
| 1422 | 1425 | ||
| 1423 | /* If the pci channel is offline, ignore possible errors, since | 1426 | /* If the pci channel is offline, ignore possible errors, since |
| @@ -1429,27 +1432,29 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba) | |||
| 1429 | if (!phba->cfg_enable_hba_reset) | 1432 | if (!phba->cfg_enable_hba_reset) |
| 1430 | return; | 1433 | return; |
| 1431 | 1434 | ||
| 1432 | /* Send an internal error event to mgmt application */ | ||
| 1433 | lpfc_board_errevt_to_mgmt(phba); | ||
| 1434 | |||
| 1435 | /* For now, the actual action for SLI4 device handling is not | ||
| 1436 | * specified yet, just treated it as adaptor hardware failure | ||
| 1437 | */ | ||
| 1438 | event_data = FC_REG_DUMP_EVENT; | ||
| 1439 | shost = lpfc_shost_from_vport(vport); | ||
| 1440 | fc_host_post_vendor_event(shost, fc_get_event_number(), | ||
| 1441 | sizeof(event_data), (char *) &event_data, | ||
| 1442 | SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX); | ||
| 1443 | |||
| 1444 | if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); | 1435 | if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); |
| 1445 | switch (if_type) { | 1436 | switch (if_type) { |
| 1446 | case LPFC_SLI_INTF_IF_TYPE_0: | 1437 | case LPFC_SLI_INTF_IF_TYPE_0: |
| 1438 | pci_rd_rc1 = lpfc_readl( | ||
| 1439 | phba->sli4_hba.u.if_type0.UERRLOregaddr, | ||
| 1440 | &uerrlo_reg); | ||
| 1441 | pci_rd_rc2 = lpfc_readl( | ||
| 1442 | phba->sli4_hba.u.if_type0.UEMASKLOregaddr, | ||
| 1443 | &uemasklo_reg); | ||
| 1444 | /* consider PCI bus read error as pci_channel_offline */ | ||
| 1445 | if (pci_rd_rc1 == -EIO && pci_rd_rc2 == -EIO) | ||
| 1446 | return; | ||
| 1447 | lpfc_sli4_offline_eratt(phba); | 1447 | lpfc_sli4_offline_eratt(phba); |
| 1448 | break; | 1448 | break; |
| 1449 | case LPFC_SLI_INTF_IF_TYPE_2: | 1449 | case LPFC_SLI_INTF_IF_TYPE_2: |
| 1450 | portstat_reg.word0 = | 1450 | pci_rd_rc1 = lpfc_readl( |
| 1451 | readl(phba->sli4_hba.u.if_type2.STATUSregaddr); | 1451 | phba->sli4_hba.u.if_type2.STATUSregaddr, |
| 1452 | 1452 | &portstat_reg.word0); | |
| 1453 | /* consider PCI bus read error as pci_channel_offline */ | ||
| 1454 | if (pci_rd_rc1 == -EIO) | ||
| 1455 | return; | ||
| 1456 | reg_err1 = readl(phba->sli4_hba.u.if_type2.ERR1regaddr); | ||
| 1457 | reg_err2 = readl(phba->sli4_hba.u.if_type2.ERR2regaddr); | ||
| 1453 | if (bf_get(lpfc_sliport_status_oti, &portstat_reg)) { | 1458 | if (bf_get(lpfc_sliport_status_oti, &portstat_reg)) { |
| 1454 | /* TODO: Register for Overtemp async events. */ | 1459 | /* TODO: Register for Overtemp async events. */ |
| 1455 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 1460 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
| @@ -1459,8 +1464,20 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba) | |||
| 1459 | phba->over_temp_state = HBA_OVER_TEMP; | 1464 | phba->over_temp_state = HBA_OVER_TEMP; |
| 1460 | spin_unlock_irq(&phba->hbalock); | 1465 | spin_unlock_irq(&phba->hbalock); |
| 1461 | lpfc_sli4_offline_eratt(phba); | 1466 | lpfc_sli4_offline_eratt(phba); |
| 1462 | return; | 1467 | break; |
| 1463 | } | 1468 | } |
| 1469 | if (reg_err1 == SLIPORT_ERR1_REG_ERR_CODE_2 && | ||
| 1470 | reg_err2 == SLIPORT_ERR2_REG_FW_RESTART) | ||
| 1471 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
| 1472 | "3143 Port Down: Firmware Restarted\n"); | ||
| 1473 | else if (reg_err1 == SLIPORT_ERR1_REG_ERR_CODE_2 && | ||
| 1474 | reg_err2 == SLIPORT_ERR2_REG_FORCED_DUMP) | ||
| 1475 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
| 1476 | "3144 Port Down: Debug Dump\n"); | ||
| 1477 | else if (reg_err1 == SLIPORT_ERR1_REG_ERR_CODE_2 && | ||
| 1478 | reg_err2 == SLIPORT_ERR2_REG_FUNC_PROVISON) | ||
| 1479 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
| 1480 | "3145 Port Down: Provisioning\n"); | ||
| 1464 | /* | 1481 | /* |
| 1465 | * On error status condition, driver need to wait for port | 1482 | * On error status condition, driver need to wait for port |
| 1466 | * ready before performing reset. | 1483 | * ready before performing reset. |
| @@ -1469,14 +1486,19 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba) | |||
| 1469 | if (!rc) { | 1486 | if (!rc) { |
| 1470 | /* need reset: attempt for port recovery */ | 1487 | /* need reset: attempt for port recovery */ |
| 1471 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 1488 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
| 1472 | "2887 Port Error: Attempting " | 1489 | "2887 Reset Needed: Attempting Port " |
| 1473 | "Port Recovery\n"); | 1490 | "Recovery...\n"); |
| 1474 | lpfc_offline_prep(phba); | 1491 | lpfc_offline_prep(phba); |
| 1475 | lpfc_offline(phba); | 1492 | lpfc_offline(phba); |
| 1476 | lpfc_sli_brdrestart(phba); | 1493 | lpfc_sli_brdrestart(phba); |
| 1477 | if (lpfc_online(phba) == 0) { | 1494 | if (lpfc_online(phba) == 0) { |
| 1478 | lpfc_unblock_mgmt_io(phba); | 1495 | lpfc_unblock_mgmt_io(phba); |
| 1479 | return; | 1496 | /* don't report event on forced debug dump */ |
| 1497 | if (reg_err1 == SLIPORT_ERR1_REG_ERR_CODE_2 && | ||
| 1498 | reg_err2 == SLIPORT_ERR2_REG_FORCED_DUMP) | ||
| 1499 | return; | ||
| 1500 | else | ||
| 1501 | break; | ||
| 1480 | } | 1502 | } |
| 1481 | /* fall through for not able to recover */ | 1503 | /* fall through for not able to recover */ |
| 1482 | } | 1504 | } |
| @@ -1486,6 +1508,16 @@ lpfc_handle_eratt_s4(struct lpfc_hba *phba) | |||
| 1486 | default: | 1508 | default: |
| 1487 | break; | 1509 | break; |
| 1488 | } | 1510 | } |
| 1511 | lpfc_printf_log(phba, KERN_WARNING, LOG_INIT, | ||
| 1512 | "3123 Report dump event to upper layer\n"); | ||
| 1513 | /* Send an internal error event to mgmt application */ | ||
| 1514 | lpfc_board_errevt_to_mgmt(phba); | ||
| 1515 | |||
| 1516 | event_data = FC_REG_DUMP_EVENT; | ||
| 1517 | shost = lpfc_shost_from_vport(vport); | ||
| 1518 | fc_host_post_vendor_event(shost, fc_get_event_number(), | ||
| 1519 | sizeof(event_data), (char *) &event_data, | ||
| 1520 | SCSI_NL_VID_TYPE_PCI | PCI_VENDOR_ID_EMULEX); | ||
| 1489 | } | 1521 | } |
| 1490 | 1522 | ||
| 1491 | /** | 1523 | /** |
| @@ -6475,6 +6507,7 @@ out_free_fcp_wq: | |||
| 6475 | phba->sli4_hba.fcp_wq[fcp_wqidx] = NULL; | 6507 | phba->sli4_hba.fcp_wq[fcp_wqidx] = NULL; |
| 6476 | } | 6508 | } |
| 6477 | kfree(phba->sli4_hba.fcp_wq); | 6509 | kfree(phba->sli4_hba.fcp_wq); |
| 6510 | phba->sli4_hba.fcp_wq = NULL; | ||
| 6478 | out_free_els_wq: | 6511 | out_free_els_wq: |
| 6479 | lpfc_sli4_queue_free(phba->sli4_hba.els_wq); | 6512 | lpfc_sli4_queue_free(phba->sli4_hba.els_wq); |
| 6480 | phba->sli4_hba.els_wq = NULL; | 6513 | phba->sli4_hba.els_wq = NULL; |
| @@ -6487,6 +6520,7 @@ out_free_fcp_cq: | |||
| 6487 | phba->sli4_hba.fcp_cq[fcp_cqidx] = NULL; | 6520 | phba->sli4_hba.fcp_cq[fcp_cqidx] = NULL; |
| 6488 | } | 6521 | } |
| 6489 | kfree(phba->sli4_hba.fcp_cq); | 6522 | kfree(phba->sli4_hba.fcp_cq); |
| 6523 | phba->sli4_hba.fcp_cq = NULL; | ||
| 6490 | out_free_els_cq: | 6524 | out_free_els_cq: |
| 6491 | lpfc_sli4_queue_free(phba->sli4_hba.els_cq); | 6525 | lpfc_sli4_queue_free(phba->sli4_hba.els_cq); |
| 6492 | phba->sli4_hba.els_cq = NULL; | 6526 | phba->sli4_hba.els_cq = NULL; |
| @@ -6499,6 +6533,7 @@ out_free_fp_eq: | |||
| 6499 | phba->sli4_hba.fp_eq[fcp_eqidx] = NULL; | 6533 | phba->sli4_hba.fp_eq[fcp_eqidx] = NULL; |
| 6500 | } | 6534 | } |
| 6501 | kfree(phba->sli4_hba.fp_eq); | 6535 | kfree(phba->sli4_hba.fp_eq); |
| 6536 | phba->sli4_hba.fp_eq = NULL; | ||
| 6502 | out_free_sp_eq: | 6537 | out_free_sp_eq: |
| 6503 | lpfc_sli4_queue_free(phba->sli4_hba.sp_eq); | 6538 | lpfc_sli4_queue_free(phba->sli4_hba.sp_eq); |
| 6504 | phba->sli4_hba.sp_eq = NULL; | 6539 | phba->sli4_hba.sp_eq = NULL; |
| @@ -6532,8 +6567,10 @@ lpfc_sli4_queue_destroy(struct lpfc_hba *phba) | |||
| 6532 | phba->sli4_hba.els_wq = NULL; | 6567 | phba->sli4_hba.els_wq = NULL; |
| 6533 | 6568 | ||
| 6534 | /* Release FCP work queue */ | 6569 | /* Release FCP work queue */ |
| 6535 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_wq_count; fcp_qidx++) | 6570 | if (phba->sli4_hba.fcp_wq != NULL) |
| 6536 | lpfc_sli4_queue_free(phba->sli4_hba.fcp_wq[fcp_qidx]); | 6571 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_wq_count; |
| 6572 | fcp_qidx++) | ||
| 6573 | lpfc_sli4_queue_free(phba->sli4_hba.fcp_wq[fcp_qidx]); | ||
| 6537 | kfree(phba->sli4_hba.fcp_wq); | 6574 | kfree(phba->sli4_hba.fcp_wq); |
| 6538 | phba->sli4_hba.fcp_wq = NULL; | 6575 | phba->sli4_hba.fcp_wq = NULL; |
| 6539 | 6576 | ||
| @@ -6553,15 +6590,18 @@ lpfc_sli4_queue_destroy(struct lpfc_hba *phba) | |||
| 6553 | 6590 | ||
| 6554 | /* Release FCP response complete queue */ | 6591 | /* Release FCP response complete queue */ |
| 6555 | fcp_qidx = 0; | 6592 | fcp_qidx = 0; |
| 6556 | do | 6593 | if (phba->sli4_hba.fcp_cq != NULL) |
| 6557 | lpfc_sli4_queue_free(phba->sli4_hba.fcp_cq[fcp_qidx]); | 6594 | do |
| 6558 | while (++fcp_qidx < phba->cfg_fcp_eq_count); | 6595 | lpfc_sli4_queue_free(phba->sli4_hba.fcp_cq[fcp_qidx]); |
| 6596 | while (++fcp_qidx < phba->cfg_fcp_eq_count); | ||
| 6559 | kfree(phba->sli4_hba.fcp_cq); | 6597 | kfree(phba->sli4_hba.fcp_cq); |
| 6560 | phba->sli4_hba.fcp_cq = NULL; | 6598 | phba->sli4_hba.fcp_cq = NULL; |
| 6561 | 6599 | ||
| 6562 | /* Release fast-path event queue */ | 6600 | /* Release fast-path event queue */ |
| 6563 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; fcp_qidx++) | 6601 | if (phba->sli4_hba.fp_eq != NULL) |
| 6564 | lpfc_sli4_queue_free(phba->sli4_hba.fp_eq[fcp_qidx]); | 6602 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; |
| 6603 | fcp_qidx++) | ||
| 6604 | lpfc_sli4_queue_free(phba->sli4_hba.fp_eq[fcp_qidx]); | ||
| 6565 | kfree(phba->sli4_hba.fp_eq); | 6605 | kfree(phba->sli4_hba.fp_eq); |
| 6566 | phba->sli4_hba.fp_eq = NULL; | 6606 | phba->sli4_hba.fp_eq = NULL; |
| 6567 | 6607 | ||
| @@ -6614,6 +6654,11 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
| 6614 | phba->sli4_hba.sp_eq->queue_id); | 6654 | phba->sli4_hba.sp_eq->queue_id); |
| 6615 | 6655 | ||
| 6616 | /* Set up fast-path event queue */ | 6656 | /* Set up fast-path event queue */ |
| 6657 | if (!phba->sli4_hba.fp_eq) { | ||
| 6658 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
| 6659 | "3147 Fast-path EQs not allocated\n"); | ||
| 6660 | goto out_destroy_sp_eq; | ||
| 6661 | } | ||
| 6617 | for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_eq_count; fcp_eqidx++) { | 6662 | for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_eq_count; fcp_eqidx++) { |
| 6618 | if (!phba->sli4_hba.fp_eq[fcp_eqidx]) { | 6663 | if (!phba->sli4_hba.fp_eq[fcp_eqidx]) { |
| 6619 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 6664 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
| @@ -6678,6 +6723,12 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
| 6678 | phba->sli4_hba.sp_eq->queue_id); | 6723 | phba->sli4_hba.sp_eq->queue_id); |
| 6679 | 6724 | ||
| 6680 | /* Set up fast-path FCP Response Complete Queue */ | 6725 | /* Set up fast-path FCP Response Complete Queue */ |
| 6726 | if (!phba->sli4_hba.fcp_cq) { | ||
| 6727 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
| 6728 | "3148 Fast-path FCP CQ array not " | ||
| 6729 | "allocated\n"); | ||
| 6730 | goto out_destroy_els_cq; | ||
| 6731 | } | ||
| 6681 | fcp_cqidx = 0; | 6732 | fcp_cqidx = 0; |
| 6682 | do { | 6733 | do { |
| 6683 | if (!phba->sli4_hba.fcp_cq[fcp_cqidx]) { | 6734 | if (!phba->sli4_hba.fcp_cq[fcp_cqidx]) { |
| @@ -6757,6 +6808,12 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
| 6757 | phba->sli4_hba.els_cq->queue_id); | 6808 | phba->sli4_hba.els_cq->queue_id); |
| 6758 | 6809 | ||
| 6759 | /* Set up fast-path FCP Work Queue */ | 6810 | /* Set up fast-path FCP Work Queue */ |
| 6811 | if (!phba->sli4_hba.fcp_wq) { | ||
| 6812 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | ||
| 6813 | "3149 Fast-path FCP WQ array not " | ||
| 6814 | "allocated\n"); | ||
| 6815 | goto out_destroy_els_wq; | ||
| 6816 | } | ||
| 6760 | for (fcp_wqidx = 0; fcp_wqidx < phba->cfg_fcp_wq_count; fcp_wqidx++) { | 6817 | for (fcp_wqidx = 0; fcp_wqidx < phba->cfg_fcp_wq_count; fcp_wqidx++) { |
| 6761 | if (!phba->sli4_hba.fcp_wq[fcp_wqidx]) { | 6818 | if (!phba->sli4_hba.fcp_wq[fcp_wqidx]) { |
| 6762 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 6819 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
| @@ -6818,18 +6875,21 @@ lpfc_sli4_queue_setup(struct lpfc_hba *phba) | |||
| 6818 | out_destroy_fcp_wq: | 6875 | out_destroy_fcp_wq: |
| 6819 | for (--fcp_wqidx; fcp_wqidx >= 0; fcp_wqidx--) | 6876 | for (--fcp_wqidx; fcp_wqidx >= 0; fcp_wqidx--) |
| 6820 | lpfc_wq_destroy(phba, phba->sli4_hba.fcp_wq[fcp_wqidx]); | 6877 | lpfc_wq_destroy(phba, phba->sli4_hba.fcp_wq[fcp_wqidx]); |
| 6878 | out_destroy_els_wq: | ||
| 6821 | lpfc_wq_destroy(phba, phba->sli4_hba.els_wq); | 6879 | lpfc_wq_destroy(phba, phba->sli4_hba.els_wq); |
| 6822 | out_destroy_mbx_wq: | 6880 | out_destroy_mbx_wq: |
| 6823 | lpfc_mq_destroy(phba, phba->sli4_hba.mbx_wq); | 6881 | lpfc_mq_destroy(phba, phba->sli4_hba.mbx_wq); |
| 6824 | out_destroy_fcp_cq: | 6882 | out_destroy_fcp_cq: |
| 6825 | for (--fcp_cqidx; fcp_cqidx >= 0; fcp_cqidx--) | 6883 | for (--fcp_cqidx; fcp_cqidx >= 0; fcp_cqidx--) |
| 6826 | lpfc_cq_destroy(phba, phba->sli4_hba.fcp_cq[fcp_cqidx]); | 6884 | lpfc_cq_destroy(phba, phba->sli4_hba.fcp_cq[fcp_cqidx]); |
| 6885 | out_destroy_els_cq: | ||
| 6827 | lpfc_cq_destroy(phba, phba->sli4_hba.els_cq); | 6886 | lpfc_cq_destroy(phba, phba->sli4_hba.els_cq); |
| 6828 | out_destroy_mbx_cq: | 6887 | out_destroy_mbx_cq: |
| 6829 | lpfc_cq_destroy(phba, phba->sli4_hba.mbx_cq); | 6888 | lpfc_cq_destroy(phba, phba->sli4_hba.mbx_cq); |
| 6830 | out_destroy_fp_eq: | 6889 | out_destroy_fp_eq: |
| 6831 | for (--fcp_eqidx; fcp_eqidx >= 0; fcp_eqidx--) | 6890 | for (--fcp_eqidx; fcp_eqidx >= 0; fcp_eqidx--) |
| 6832 | lpfc_eq_destroy(phba, phba->sli4_hba.fp_eq[fcp_eqidx]); | 6891 | lpfc_eq_destroy(phba, phba->sli4_hba.fp_eq[fcp_eqidx]); |
| 6892 | out_destroy_sp_eq: | ||
| 6833 | lpfc_eq_destroy(phba, phba->sli4_hba.sp_eq); | 6893 | lpfc_eq_destroy(phba, phba->sli4_hba.sp_eq); |
| 6834 | out_error: | 6894 | out_error: |
| 6835 | return rc; | 6895 | return rc; |
| @@ -6866,13 +6926,18 @@ lpfc_sli4_queue_unset(struct lpfc_hba *phba) | |||
| 6866 | /* Unset ELS complete queue */ | 6926 | /* Unset ELS complete queue */ |
| 6867 | lpfc_cq_destroy(phba, phba->sli4_hba.els_cq); | 6927 | lpfc_cq_destroy(phba, phba->sli4_hba.els_cq); |
| 6868 | /* Unset FCP response complete queue */ | 6928 | /* Unset FCP response complete queue */ |
| 6869 | fcp_qidx = 0; | 6929 | if (phba->sli4_hba.fcp_cq) { |
| 6870 | do { | 6930 | fcp_qidx = 0; |
| 6871 | lpfc_cq_destroy(phba, phba->sli4_hba.fcp_cq[fcp_qidx]); | 6931 | do { |
| 6872 | } while (++fcp_qidx < phba->cfg_fcp_eq_count); | 6932 | lpfc_cq_destroy(phba, phba->sli4_hba.fcp_cq[fcp_qidx]); |
| 6933 | } while (++fcp_qidx < phba->cfg_fcp_eq_count); | ||
| 6934 | } | ||
| 6873 | /* Unset fast-path event queue */ | 6935 | /* Unset fast-path event queue */ |
| 6874 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; fcp_qidx++) | 6936 | if (phba->sli4_hba.fp_eq) { |
| 6875 | lpfc_eq_destroy(phba, phba->sli4_hba.fp_eq[fcp_qidx]); | 6937 | for (fcp_qidx = 0; fcp_qidx < phba->cfg_fcp_eq_count; |
| 6938 | fcp_qidx++) | ||
| 6939 | lpfc_eq_destroy(phba, phba->sli4_hba.fp_eq[fcp_qidx]); | ||
| 6940 | } | ||
| 6876 | /* Unset slow-path event queue */ | 6941 | /* Unset slow-path event queue */ |
| 6877 | lpfc_eq_destroy(phba, phba->sli4_hba.sp_eq); | 6942 | lpfc_eq_destroy(phba, phba->sli4_hba.sp_eq); |
| 6878 | } | 6943 | } |
| @@ -7411,22 +7476,25 @@ out: | |||
| 7411 | static void | 7476 | static void |
| 7412 | lpfc_sli4_pci_mem_unset(struct lpfc_hba *phba) | 7477 | lpfc_sli4_pci_mem_unset(struct lpfc_hba *phba) |
| 7413 | { | 7478 | { |
| 7414 | struct pci_dev *pdev; | 7479 | uint32_t if_type; |
| 7415 | 7480 | if_type = bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf); | |
| 7416 | /* Obtain PCI device reference */ | ||
| 7417 | if (!phba->pcidev) | ||
| 7418 | return; | ||
| 7419 | else | ||
| 7420 | pdev = phba->pcidev; | ||
| 7421 | |||
| 7422 | /* Free coherent DMA memory allocated */ | ||
| 7423 | |||
| 7424 | /* Unmap I/O memory space */ | ||
| 7425 | iounmap(phba->sli4_hba.drbl_regs_memmap_p); | ||
| 7426 | iounmap(phba->sli4_hba.ctrl_regs_memmap_p); | ||
| 7427 | iounmap(phba->sli4_hba.conf_regs_memmap_p); | ||
| 7428 | 7481 | ||
| 7429 | return; | 7482 | switch (if_type) { |
| 7483 | case LPFC_SLI_INTF_IF_TYPE_0: | ||
| 7484 | iounmap(phba->sli4_hba.drbl_regs_memmap_p); | ||
| 7485 | iounmap(phba->sli4_hba.ctrl_regs_memmap_p); | ||
| 7486 | iounmap(phba->sli4_hba.conf_regs_memmap_p); | ||
| 7487 | break; | ||
| 7488 | case LPFC_SLI_INTF_IF_TYPE_2: | ||
| 7489 | iounmap(phba->sli4_hba.conf_regs_memmap_p); | ||
| 7490 | break; | ||
| 7491 | case LPFC_SLI_INTF_IF_TYPE_1: | ||
| 7492 | default: | ||
| 7493 | dev_printk(KERN_ERR, &phba->pcidev->dev, | ||
| 7494 | "FATAL - unsupported SLI4 interface type - %d\n", | ||
| 7495 | if_type); | ||
| 7496 | break; | ||
| 7497 | } | ||
| 7430 | } | 7498 | } |
| 7431 | 7499 | ||
| 7432 | /** | 7500 | /** |
diff --git a/drivers/scsi/lpfc/lpfc_mem.c b/drivers/scsi/lpfc/lpfc_mem.c index 10d5b5e41499..ade763d3930a 100644 --- a/drivers/scsi/lpfc/lpfc_mem.c +++ b/drivers/scsi/lpfc/lpfc_mem.c | |||
| @@ -389,7 +389,7 @@ lpfc_els_hbq_alloc(struct lpfc_hba *phba) | |||
| 389 | { | 389 | { |
| 390 | struct hbq_dmabuf *hbqbp; | 390 | struct hbq_dmabuf *hbqbp; |
| 391 | 391 | ||
| 392 | hbqbp = kmalloc(sizeof(struct hbq_dmabuf), GFP_KERNEL); | 392 | hbqbp = kzalloc(sizeof(struct hbq_dmabuf), GFP_KERNEL); |
| 393 | if (!hbqbp) | 393 | if (!hbqbp) |
| 394 | return NULL; | 394 | return NULL; |
| 395 | 395 | ||
| @@ -441,7 +441,7 @@ lpfc_sli4_rb_alloc(struct lpfc_hba *phba) | |||
| 441 | { | 441 | { |
| 442 | struct hbq_dmabuf *dma_buf; | 442 | struct hbq_dmabuf *dma_buf; |
| 443 | 443 | ||
| 444 | dma_buf = kmalloc(sizeof(struct hbq_dmabuf), GFP_KERNEL); | 444 | dma_buf = kzalloc(sizeof(struct hbq_dmabuf), GFP_KERNEL); |
| 445 | if (!dma_buf) | 445 | if (!dma_buf) |
| 446 | return NULL; | 446 | return NULL; |
| 447 | 447 | ||
diff --git a/drivers/scsi/lpfc/lpfc_sli.c b/drivers/scsi/lpfc/lpfc_sli.c index 97bbafb21bc2..e27cb44b3ec2 100644 --- a/drivers/scsi/lpfc/lpfc_sli.c +++ b/drivers/scsi/lpfc/lpfc_sli.c | |||
| @@ -89,10 +89,15 @@ lpfc_get_iocb_from_iocbq(struct lpfc_iocbq *iocbq) | |||
| 89 | static uint32_t | 89 | static uint32_t |
| 90 | lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe *wqe) | 90 | lpfc_sli4_wq_put(struct lpfc_queue *q, union lpfc_wqe *wqe) |
| 91 | { | 91 | { |
| 92 | union lpfc_wqe *temp_wqe = q->qe[q->host_index].wqe; | 92 | union lpfc_wqe *temp_wqe; |
| 93 | struct lpfc_register doorbell; | 93 | struct lpfc_register doorbell; |
| 94 | uint32_t host_index; | 94 | uint32_t host_index; |
| 95 | 95 | ||
| 96 | /* sanity check on queue memory */ | ||
| 97 | if (unlikely(!q)) | ||
| 98 | return -ENOMEM; | ||
| 99 | temp_wqe = q->qe[q->host_index].wqe; | ||
| 100 | |||
| 96 | /* If the host has not yet processed the next entry then we are done */ | 101 | /* If the host has not yet processed the next entry then we are done */ |
| 97 | if (((q->host_index + 1) % q->entry_count) == q->hba_index) | 102 | if (((q->host_index + 1) % q->entry_count) == q->hba_index) |
| 98 | return -ENOMEM; | 103 | return -ENOMEM; |
| @@ -134,6 +139,10 @@ lpfc_sli4_wq_release(struct lpfc_queue *q, uint32_t index) | |||
| 134 | { | 139 | { |
| 135 | uint32_t released = 0; | 140 | uint32_t released = 0; |
| 136 | 141 | ||
| 142 | /* sanity check on queue memory */ | ||
| 143 | if (unlikely(!q)) | ||
| 144 | return 0; | ||
| 145 | |||
| 137 | if (q->hba_index == index) | 146 | if (q->hba_index == index) |
| 138 | return 0; | 147 | return 0; |
| 139 | do { | 148 | do { |
| @@ -158,10 +167,15 @@ lpfc_sli4_wq_release(struct lpfc_queue *q, uint32_t index) | |||
| 158 | static uint32_t | 167 | static uint32_t |
| 159 | lpfc_sli4_mq_put(struct lpfc_queue *q, struct lpfc_mqe *mqe) | 168 | lpfc_sli4_mq_put(struct lpfc_queue *q, struct lpfc_mqe *mqe) |
| 160 | { | 169 | { |
| 161 | struct lpfc_mqe *temp_mqe = q->qe[q->host_index].mqe; | 170 | struct lpfc_mqe *temp_mqe; |
| 162 | struct lpfc_register doorbell; | 171 | struct lpfc_register doorbell; |
| 163 | uint32_t host_index; | 172 | uint32_t host_index; |
| 164 | 173 | ||
| 174 | /* sanity check on queue memory */ | ||
| 175 | if (unlikely(!q)) | ||
| 176 | return -ENOMEM; | ||
| 177 | temp_mqe = q->qe[q->host_index].mqe; | ||
| 178 | |||
| 165 | /* If the host has not yet processed the next entry then we are done */ | 179 | /* If the host has not yet processed the next entry then we are done */ |
| 166 | if (((q->host_index + 1) % q->entry_count) == q->hba_index) | 180 | if (((q->host_index + 1) % q->entry_count) == q->hba_index) |
| 167 | return -ENOMEM; | 181 | return -ENOMEM; |
| @@ -195,6 +209,10 @@ lpfc_sli4_mq_put(struct lpfc_queue *q, struct lpfc_mqe *mqe) | |||
| 195 | static uint32_t | 209 | static uint32_t |
| 196 | lpfc_sli4_mq_release(struct lpfc_queue *q) | 210 | lpfc_sli4_mq_release(struct lpfc_queue *q) |
| 197 | { | 211 | { |
| 212 | /* sanity check on queue memory */ | ||
| 213 | if (unlikely(!q)) | ||
| 214 | return 0; | ||
| 215 | |||
| 198 | /* Clear the mailbox pointer for completion */ | 216 | /* Clear the mailbox pointer for completion */ |
| 199 | q->phba->mbox = NULL; | 217 | q->phba->mbox = NULL; |
| 200 | q->hba_index = ((q->hba_index + 1) % q->entry_count); | 218 | q->hba_index = ((q->hba_index + 1) % q->entry_count); |
| @@ -213,7 +231,12 @@ lpfc_sli4_mq_release(struct lpfc_queue *q) | |||
| 213 | static struct lpfc_eqe * | 231 | static struct lpfc_eqe * |
| 214 | lpfc_sli4_eq_get(struct lpfc_queue *q) | 232 | lpfc_sli4_eq_get(struct lpfc_queue *q) |
| 215 | { | 233 | { |
| 216 | struct lpfc_eqe *eqe = q->qe[q->hba_index].eqe; | 234 | struct lpfc_eqe *eqe; |
| 235 | |||
| 236 | /* sanity check on queue memory */ | ||
| 237 | if (unlikely(!q)) | ||
| 238 | return NULL; | ||
| 239 | eqe = q->qe[q->hba_index].eqe; | ||
| 217 | 240 | ||
| 218 | /* If the next EQE is not valid then we are done */ | 241 | /* If the next EQE is not valid then we are done */ |
| 219 | if (!bf_get_le32(lpfc_eqe_valid, eqe)) | 242 | if (!bf_get_le32(lpfc_eqe_valid, eqe)) |
| @@ -248,6 +271,10 @@ lpfc_sli4_eq_release(struct lpfc_queue *q, bool arm) | |||
| 248 | struct lpfc_eqe *temp_eqe; | 271 | struct lpfc_eqe *temp_eqe; |
| 249 | struct lpfc_register doorbell; | 272 | struct lpfc_register doorbell; |
| 250 | 273 | ||
| 274 | /* sanity check on queue memory */ | ||
| 275 | if (unlikely(!q)) | ||
| 276 | return 0; | ||
| 277 | |||
| 251 | /* while there are valid entries */ | 278 | /* while there are valid entries */ |
| 252 | while (q->hba_index != q->host_index) { | 279 | while (q->hba_index != q->host_index) { |
| 253 | temp_eqe = q->qe[q->host_index].eqe; | 280 | temp_eqe = q->qe[q->host_index].eqe; |
| @@ -288,6 +315,10 @@ lpfc_sli4_cq_get(struct lpfc_queue *q) | |||
| 288 | { | 315 | { |
| 289 | struct lpfc_cqe *cqe; | 316 | struct lpfc_cqe *cqe; |
| 290 | 317 | ||
| 318 | /* sanity check on queue memory */ | ||
| 319 | if (unlikely(!q)) | ||
| 320 | return NULL; | ||
| 321 | |||
| 291 | /* If the next CQE is not valid then we are done */ | 322 | /* If the next CQE is not valid then we are done */ |
| 292 | if (!bf_get_le32(lpfc_cqe_valid, q->qe[q->hba_index].cqe)) | 323 | if (!bf_get_le32(lpfc_cqe_valid, q->qe[q->hba_index].cqe)) |
| 293 | return NULL; | 324 | return NULL; |
| @@ -322,6 +353,9 @@ lpfc_sli4_cq_release(struct lpfc_queue *q, bool arm) | |||
| 322 | struct lpfc_cqe *temp_qe; | 353 | struct lpfc_cqe *temp_qe; |
| 323 | struct lpfc_register doorbell; | 354 | struct lpfc_register doorbell; |
| 324 | 355 | ||
| 356 | /* sanity check on queue memory */ | ||
| 357 | if (unlikely(!q)) | ||
| 358 | return 0; | ||
| 325 | /* while there are valid entries */ | 359 | /* while there are valid entries */ |
| 326 | while (q->hba_index != q->host_index) { | 360 | while (q->hba_index != q->host_index) { |
| 327 | temp_qe = q->qe[q->host_index].cqe; | 361 | temp_qe = q->qe[q->host_index].cqe; |
| @@ -359,11 +393,17 @@ static int | |||
| 359 | lpfc_sli4_rq_put(struct lpfc_queue *hq, struct lpfc_queue *dq, | 393 | lpfc_sli4_rq_put(struct lpfc_queue *hq, struct lpfc_queue *dq, |
| 360 | struct lpfc_rqe *hrqe, struct lpfc_rqe *drqe) | 394 | struct lpfc_rqe *hrqe, struct lpfc_rqe *drqe) |
| 361 | { | 395 | { |
| 362 | struct lpfc_rqe *temp_hrqe = hq->qe[hq->host_index].rqe; | 396 | struct lpfc_rqe *temp_hrqe; |
| 363 | struct lpfc_rqe *temp_drqe = dq->qe[dq->host_index].rqe; | 397 | struct lpfc_rqe *temp_drqe; |
| 364 | struct lpfc_register doorbell; | 398 | struct lpfc_register doorbell; |
| 365 | int put_index = hq->host_index; | 399 | int put_index = hq->host_index; |
| 366 | 400 | ||
| 401 | /* sanity check on queue memory */ | ||
| 402 | if (unlikely(!hq) || unlikely(!dq)) | ||
| 403 | return -ENOMEM; | ||
| 404 | temp_hrqe = hq->qe[hq->host_index].rqe; | ||
| 405 | temp_drqe = dq->qe[dq->host_index].rqe; | ||
| 406 | |||
| 367 | if (hq->type != LPFC_HRQ || dq->type != LPFC_DRQ) | 407 | if (hq->type != LPFC_HRQ || dq->type != LPFC_DRQ) |
| 368 | return -EINVAL; | 408 | return -EINVAL; |
| 369 | if (hq->host_index != dq->host_index) | 409 | if (hq->host_index != dq->host_index) |
| @@ -402,6 +442,10 @@ lpfc_sli4_rq_put(struct lpfc_queue *hq, struct lpfc_queue *dq, | |||
| 402 | static uint32_t | 442 | static uint32_t |
| 403 | lpfc_sli4_rq_release(struct lpfc_queue *hq, struct lpfc_queue *dq) | 443 | lpfc_sli4_rq_release(struct lpfc_queue *hq, struct lpfc_queue *dq) |
| 404 | { | 444 | { |
| 445 | /* sanity check on queue memory */ | ||
| 446 | if (unlikely(!hq) || unlikely(!dq)) | ||
| 447 | return 0; | ||
| 448 | |||
| 405 | if ((hq->type != LPFC_HRQ) || (dq->type != LPFC_DRQ)) | 449 | if ((hq->type != LPFC_HRQ) || (dq->type != LPFC_DRQ)) |
| 406 | return 0; | 450 | return 0; |
| 407 | hq->hba_index = ((hq->hba_index + 1) % hq->entry_count); | 451 | hq->hba_index = ((hq->hba_index + 1) % hq->entry_count); |
| @@ -3851,7 +3895,6 @@ lpfc_sli4_brdreset(struct lpfc_hba *phba) | |||
| 3851 | { | 3895 | { |
| 3852 | struct lpfc_sli *psli = &phba->sli; | 3896 | struct lpfc_sli *psli = &phba->sli; |
| 3853 | uint16_t cfg_value; | 3897 | uint16_t cfg_value; |
| 3854 | uint8_t qindx; | ||
| 3855 | 3898 | ||
| 3856 | /* Reset HBA */ | 3899 | /* Reset HBA */ |
| 3857 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, | 3900 | lpfc_printf_log(phba, KERN_INFO, LOG_SLI, |
| @@ -3867,19 +3910,6 @@ lpfc_sli4_brdreset(struct lpfc_hba *phba) | |||
| 3867 | spin_lock_irq(&phba->hbalock); | 3910 | spin_lock_irq(&phba->hbalock); |
| 3868 | psli->sli_flag &= ~(LPFC_PROCESS_LA); | 3911 | psli->sli_flag &= ~(LPFC_PROCESS_LA); |
| 3869 | phba->fcf.fcf_flag = 0; | 3912 | phba->fcf.fcf_flag = 0; |
| 3870 | /* Clean up the child queue list for the CQs */ | ||
| 3871 | list_del_init(&phba->sli4_hba.mbx_wq->list); | ||
| 3872 | list_del_init(&phba->sli4_hba.els_wq->list); | ||
| 3873 | list_del_init(&phba->sli4_hba.hdr_rq->list); | ||
| 3874 | list_del_init(&phba->sli4_hba.dat_rq->list); | ||
| 3875 | list_del_init(&phba->sli4_hba.mbx_cq->list); | ||
| 3876 | list_del_init(&phba->sli4_hba.els_cq->list); | ||
| 3877 | for (qindx = 0; qindx < phba->cfg_fcp_wq_count; qindx++) | ||
| 3878 | list_del_init(&phba->sli4_hba.fcp_wq[qindx]->list); | ||
| 3879 | qindx = 0; | ||
| 3880 | do | ||
| 3881 | list_del_init(&phba->sli4_hba.fcp_cq[qindx]->list); | ||
| 3882 | while (++qindx < phba->cfg_fcp_eq_count); | ||
| 3883 | spin_unlock_irq(&phba->hbalock); | 3913 | spin_unlock_irq(&phba->hbalock); |
| 3884 | 3914 | ||
| 3885 | /* Now physically reset the device */ | 3915 | /* Now physically reset the device */ |
| @@ -3892,6 +3922,7 @@ lpfc_sli4_brdreset(struct lpfc_hba *phba) | |||
| 3892 | ~(PCI_COMMAND_PARITY | PCI_COMMAND_SERR))); | 3922 | ~(PCI_COMMAND_PARITY | PCI_COMMAND_SERR))); |
| 3893 | 3923 | ||
| 3894 | /* Perform FCoE PCI function reset */ | 3924 | /* Perform FCoE PCI function reset */ |
| 3925 | lpfc_sli4_queue_destroy(phba); | ||
| 3895 | lpfc_pci_function_reset(phba); | 3926 | lpfc_pci_function_reset(phba); |
| 3896 | 3927 | ||
| 3897 | /* Restore PCI cmd register */ | 3928 | /* Restore PCI cmd register */ |
| @@ -4869,14 +4900,19 @@ lpfc_sli4_arm_cqeq_intr(struct lpfc_hba *phba) | |||
| 4869 | lpfc_sli4_cq_release(phba->sli4_hba.mbx_cq, LPFC_QUEUE_REARM); | 4900 | lpfc_sli4_cq_release(phba->sli4_hba.mbx_cq, LPFC_QUEUE_REARM); |
| 4870 | lpfc_sli4_cq_release(phba->sli4_hba.els_cq, LPFC_QUEUE_REARM); | 4901 | lpfc_sli4_cq_release(phba->sli4_hba.els_cq, LPFC_QUEUE_REARM); |
| 4871 | fcp_eqidx = 0; | 4902 | fcp_eqidx = 0; |
| 4872 | do | 4903 | if (phba->sli4_hba.fcp_cq) { |
| 4873 | lpfc_sli4_cq_release(phba->sli4_hba.fcp_cq[fcp_eqidx], | 4904 | do |
| 4874 | LPFC_QUEUE_REARM); | 4905 | lpfc_sli4_cq_release(phba->sli4_hba.fcp_cq[fcp_eqidx], |
| 4875 | while (++fcp_eqidx < phba->cfg_fcp_eq_count); | 4906 | LPFC_QUEUE_REARM); |
| 4907 | while (++fcp_eqidx < phba->cfg_fcp_eq_count); | ||
| 4908 | } | ||
| 4876 | lpfc_sli4_eq_release(phba->sli4_hba.sp_eq, LPFC_QUEUE_REARM); | 4909 | lpfc_sli4_eq_release(phba->sli4_hba.sp_eq, LPFC_QUEUE_REARM); |
| 4877 | for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_eq_count; fcp_eqidx++) | 4910 | if (phba->sli4_hba.fp_eq) { |
| 4878 | lpfc_sli4_eq_release(phba->sli4_hba.fp_eq[fcp_eqidx], | 4911 | for (fcp_eqidx = 0; fcp_eqidx < phba->cfg_fcp_eq_count; |
| 4879 | LPFC_QUEUE_REARM); | 4912 | fcp_eqidx++) |
| 4913 | lpfc_sli4_eq_release(phba->sli4_hba.fp_eq[fcp_eqidx], | ||
| 4914 | LPFC_QUEUE_REARM); | ||
| 4915 | } | ||
| 4880 | } | 4916 | } |
| 4881 | 4917 | ||
| 4882 | /** | 4918 | /** |
| @@ -8083,6 +8119,8 @@ __lpfc_sli_issue_iocb_s4(struct lpfc_hba *phba, uint32_t ring_number, | |||
| 8083 | */ | 8119 | */ |
| 8084 | if (piocb->iocb_flag & LPFC_IO_FCP) | 8120 | if (piocb->iocb_flag & LPFC_IO_FCP) |
| 8085 | piocb->fcp_wqidx = lpfc_sli4_scmd_to_wqidx_distr(phba); | 8121 | piocb->fcp_wqidx = lpfc_sli4_scmd_to_wqidx_distr(phba); |
| 8122 | if (unlikely(!phba->sli4_hba.fcp_wq)) | ||
| 8123 | return IOCB_ERROR; | ||
| 8086 | if (lpfc_sli4_wq_put(phba->sli4_hba.fcp_wq[piocb->fcp_wqidx], | 8124 | if (lpfc_sli4_wq_put(phba->sli4_hba.fcp_wq[piocb->fcp_wqidx], |
| 8087 | &wqe)) | 8125 | &wqe)) |
| 8088 | return IOCB_ERROR; | 8126 | return IOCB_ERROR; |
| @@ -9900,7 +9938,7 @@ lpfc_sli4_eratt_read(struct lpfc_hba *phba) | |||
| 9900 | phba->work_status[1] = | 9938 | phba->work_status[1] = |
| 9901 | readl(phba->sli4_hba.u.if_type2.ERR2regaddr); | 9939 | readl(phba->sli4_hba.u.if_type2.ERR2regaddr); |
| 9902 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, | 9940 | lpfc_printf_log(phba, KERN_ERR, LOG_INIT, |
| 9903 | "2885 Port Error Detected: " | 9941 | "2885 Port Status Event: " |
| 9904 | "port status reg 0x%x, " | 9942 | "port status reg 0x%x, " |
| 9905 | "port smphr reg 0x%x, " | 9943 | "port smphr reg 0x%x, " |
| 9906 | "error 1=0x%x, error 2=0x%x\n", | 9944 | "error 1=0x%x, error 2=0x%x\n", |
| @@ -10906,6 +10944,9 @@ static void | |||
| 10906 | lpfc_sli4_sp_handle_rel_wcqe(struct lpfc_hba *phba, | 10944 | lpfc_sli4_sp_handle_rel_wcqe(struct lpfc_hba *phba, |
| 10907 | struct lpfc_wcqe_release *wcqe) | 10945 | struct lpfc_wcqe_release *wcqe) |
| 10908 | { | 10946 | { |
| 10947 | /* sanity check on queue memory */ | ||
| 10948 | if (unlikely(!phba->sli4_hba.els_wq)) | ||
| 10949 | return; | ||
| 10909 | /* Check for the slow-path ELS work queue */ | 10950 | /* Check for the slow-path ELS work queue */ |
| 10910 | if (bf_get(lpfc_wcqe_r_wq_id, wcqe) == phba->sli4_hba.els_wq->queue_id) | 10951 | if (bf_get(lpfc_wcqe_r_wq_id, wcqe) == phba->sli4_hba.els_wq->queue_id) |
| 10911 | lpfc_sli4_wq_release(phba->sli4_hba.els_wq, | 10952 | lpfc_sli4_wq_release(phba->sli4_hba.els_wq, |
| @@ -10995,6 +11036,10 @@ lpfc_sli4_sp_handle_rcqe(struct lpfc_hba *phba, struct lpfc_rcqe *rcqe) | |||
| 10995 | uint32_t status, rq_id; | 11036 | uint32_t status, rq_id; |
| 10996 | unsigned long iflags; | 11037 | unsigned long iflags; |
| 10997 | 11038 | ||
| 11039 | /* sanity check on queue memory */ | ||
| 11040 | if (unlikely(!hrq) || unlikely(!drq)) | ||
| 11041 | return workposted; | ||
| 11042 | |||
| 10998 | if (bf_get(lpfc_cqe_code, rcqe) == CQE_CODE_RECEIVE_V1) | 11043 | if (bf_get(lpfc_cqe_code, rcqe) == CQE_CODE_RECEIVE_V1) |
| 10999 | rq_id = bf_get(lpfc_rcqe_rq_id_v1, rcqe); | 11044 | rq_id = bf_get(lpfc_rcqe_rq_id_v1, rcqe); |
| 11000 | else | 11045 | else |
| @@ -11129,6 +11174,9 @@ lpfc_sli4_sp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe) | |||
| 11129 | 11174 | ||
| 11130 | /* Search for completion queue pointer matching this cqid */ | 11175 | /* Search for completion queue pointer matching this cqid */ |
| 11131 | speq = phba->sli4_hba.sp_eq; | 11176 | speq = phba->sli4_hba.sp_eq; |
| 11177 | /* sanity check on queue memory */ | ||
| 11178 | if (unlikely(!speq)) | ||
| 11179 | return; | ||
| 11132 | list_for_each_entry(childq, &speq->child_list, list) { | 11180 | list_for_each_entry(childq, &speq->child_list, list) { |
| 11133 | if (childq->queue_id == cqid) { | 11181 | if (childq->queue_id == cqid) { |
| 11134 | cq = childq; | 11182 | cq = childq; |
| @@ -11370,12 +11418,18 @@ lpfc_sli4_fp_handle_eqe(struct lpfc_hba *phba, struct lpfc_eqe *eqe, | |||
| 11370 | return; | 11418 | return; |
| 11371 | } | 11419 | } |
| 11372 | 11420 | ||
| 11421 | if (unlikely(!phba->sli4_hba.fcp_cq)) { | ||
| 11422 | lpfc_printf_log(phba, KERN_WARNING, LOG_SLI, | ||
| 11423 | "3146 Fast-path completion queues " | ||
| 11424 | "does not exist\n"); | ||
| 11425 | return; | ||
| 11426 | } | ||
| 11373 | cq = phba->sli4_hba.fcp_cq[fcp_cqidx]; | 11427 | cq = phba->sli4_hba.fcp_cq[fcp_cqidx]; |
| 11374 | if (unlikely(!cq)) { | 11428 | if (unlikely(!cq)) { |
| 11375 | if (phba->sli.sli_flag & LPFC_SLI_ACTIVE) | 11429 | if (phba->sli.sli_flag & LPFC_SLI_ACTIVE) |
| 11376 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, | 11430 | lpfc_printf_log(phba, KERN_ERR, LOG_SLI, |
| 11377 | "0367 Fast-path completion queue " | 11431 | "0367 Fast-path completion queue " |
| 11378 | "does not exist\n"); | 11432 | "(%d) does not exist\n", fcp_cqidx); |
| 11379 | return; | 11433 | return; |
| 11380 | } | 11434 | } |
| 11381 | 11435 | ||
| @@ -11546,6 +11600,8 @@ lpfc_sli4_fp_intr_handler(int irq, void *dev_id) | |||
| 11546 | 11600 | ||
| 11547 | /* Get to the EQ struct associated with this vector */ | 11601 | /* Get to the EQ struct associated with this vector */ |
| 11548 | fpeq = phba->sli4_hba.fp_eq[fcp_eqidx]; | 11602 | fpeq = phba->sli4_hba.fp_eq[fcp_eqidx]; |
| 11603 | if (unlikely(!fpeq)) | ||
| 11604 | return IRQ_NONE; | ||
| 11549 | 11605 | ||
| 11550 | /* Check device state for handling interrupt */ | 11606 | /* Check device state for handling interrupt */ |
| 11551 | if (unlikely(lpfc_intr_state_check(phba))) { | 11607 | if (unlikely(lpfc_intr_state_check(phba))) { |
| @@ -11764,6 +11820,9 @@ lpfc_eq_create(struct lpfc_hba *phba, struct lpfc_queue *eq, uint16_t imax) | |||
| 11764 | uint16_t dmult; | 11820 | uint16_t dmult; |
| 11765 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; | 11821 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; |
| 11766 | 11822 | ||
| 11823 | /* sanity check on queue memory */ | ||
| 11824 | if (!eq) | ||
| 11825 | return -ENODEV; | ||
| 11767 | if (!phba->sli4_hba.pc_sli4_params.supported) | 11826 | if (!phba->sli4_hba.pc_sli4_params.supported) |
| 11768 | hw_page_size = SLI4_PAGE_SIZE; | 11827 | hw_page_size = SLI4_PAGE_SIZE; |
| 11769 | 11828 | ||
| @@ -11880,6 +11939,9 @@ lpfc_cq_create(struct lpfc_hba *phba, struct lpfc_queue *cq, | |||
| 11880 | union lpfc_sli4_cfg_shdr *shdr; | 11939 | union lpfc_sli4_cfg_shdr *shdr; |
| 11881 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; | 11940 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; |
| 11882 | 11941 | ||
| 11942 | /* sanity check on queue memory */ | ||
| 11943 | if (!cq || !eq) | ||
| 11944 | return -ENODEV; | ||
| 11883 | if (!phba->sli4_hba.pc_sli4_params.supported) | 11945 | if (!phba->sli4_hba.pc_sli4_params.supported) |
| 11884 | hw_page_size = SLI4_PAGE_SIZE; | 11946 | hw_page_size = SLI4_PAGE_SIZE; |
| 11885 | 11947 | ||
| @@ -12062,6 +12124,9 @@ lpfc_mq_create(struct lpfc_hba *phba, struct lpfc_queue *mq, | |||
| 12062 | union lpfc_sli4_cfg_shdr *shdr; | 12124 | union lpfc_sli4_cfg_shdr *shdr; |
| 12063 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; | 12125 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; |
| 12064 | 12126 | ||
| 12127 | /* sanity check on queue memory */ | ||
| 12128 | if (!mq || !cq) | ||
| 12129 | return -ENODEV; | ||
| 12065 | if (!phba->sli4_hba.pc_sli4_params.supported) | 12130 | if (!phba->sli4_hba.pc_sli4_params.supported) |
| 12066 | hw_page_size = SLI4_PAGE_SIZE; | 12131 | hw_page_size = SLI4_PAGE_SIZE; |
| 12067 | 12132 | ||
| @@ -12212,6 +12277,9 @@ lpfc_wq_create(struct lpfc_hba *phba, struct lpfc_queue *wq, | |||
| 12212 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; | 12277 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; |
| 12213 | struct dma_address *page; | 12278 | struct dma_address *page; |
| 12214 | 12279 | ||
| 12280 | /* sanity check on queue memory */ | ||
| 12281 | if (!wq || !cq) | ||
| 12282 | return -ENODEV; | ||
| 12215 | if (!phba->sli4_hba.pc_sli4_params.supported) | 12283 | if (!phba->sli4_hba.pc_sli4_params.supported) |
| 12216 | hw_page_size = SLI4_PAGE_SIZE; | 12284 | hw_page_size = SLI4_PAGE_SIZE; |
| 12217 | 12285 | ||
| @@ -12304,6 +12372,9 @@ lpfc_rq_adjust_repost(struct lpfc_hba *phba, struct lpfc_queue *rq, int qno) | |||
| 12304 | { | 12372 | { |
| 12305 | uint32_t cnt; | 12373 | uint32_t cnt; |
| 12306 | 12374 | ||
| 12375 | /* sanity check on queue memory */ | ||
| 12376 | if (!rq) | ||
| 12377 | return; | ||
| 12307 | cnt = lpfc_hbq_defs[qno]->entry_count; | 12378 | cnt = lpfc_hbq_defs[qno]->entry_count; |
| 12308 | 12379 | ||
| 12309 | /* Recalc repost for RQs based on buffers initially posted */ | 12380 | /* Recalc repost for RQs based on buffers initially posted */ |
| @@ -12349,6 +12420,9 @@ lpfc_rq_create(struct lpfc_hba *phba, struct lpfc_queue *hrq, | |||
| 12349 | union lpfc_sli4_cfg_shdr *shdr; | 12420 | union lpfc_sli4_cfg_shdr *shdr; |
| 12350 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; | 12421 | uint32_t hw_page_size = phba->sli4_hba.pc_sli4_params.if_page_sz; |
| 12351 | 12422 | ||
| 12423 | /* sanity check on queue memory */ | ||
| 12424 | if (!hrq || !drq || !cq) | ||
| 12425 | return -ENODEV; | ||
| 12352 | if (!phba->sli4_hba.pc_sli4_params.supported) | 12426 | if (!phba->sli4_hba.pc_sli4_params.supported) |
| 12353 | hw_page_size = SLI4_PAGE_SIZE; | 12427 | hw_page_size = SLI4_PAGE_SIZE; |
| 12354 | 12428 | ||
| @@ -12550,6 +12624,7 @@ lpfc_eq_destroy(struct lpfc_hba *phba, struct lpfc_queue *eq) | |||
| 12550 | uint32_t shdr_status, shdr_add_status; | 12624 | uint32_t shdr_status, shdr_add_status; |
| 12551 | union lpfc_sli4_cfg_shdr *shdr; | 12625 | union lpfc_sli4_cfg_shdr *shdr; |
| 12552 | 12626 | ||
| 12627 | /* sanity check on queue memory */ | ||
| 12553 | if (!eq) | 12628 | if (!eq) |
| 12554 | return -ENODEV; | 12629 | return -ENODEV; |
| 12555 | mbox = mempool_alloc(eq->phba->mbox_mem_pool, GFP_KERNEL); | 12630 | mbox = mempool_alloc(eq->phba->mbox_mem_pool, GFP_KERNEL); |
| @@ -12605,6 +12680,7 @@ lpfc_cq_destroy(struct lpfc_hba *phba, struct lpfc_queue *cq) | |||
| 12605 | uint32_t shdr_status, shdr_add_status; | 12680 | uint32_t shdr_status, shdr_add_status; |
| 12606 | union lpfc_sli4_cfg_shdr *shdr; | 12681 | union lpfc_sli4_cfg_shdr *shdr; |
| 12607 | 12682 | ||
| 12683 | /* sanity check on queue memory */ | ||
| 12608 | if (!cq) | 12684 | if (!cq) |
| 12609 | return -ENODEV; | 12685 | return -ENODEV; |
| 12610 | mbox = mempool_alloc(cq->phba->mbox_mem_pool, GFP_KERNEL); | 12686 | mbox = mempool_alloc(cq->phba->mbox_mem_pool, GFP_KERNEL); |
| @@ -12658,6 +12734,7 @@ lpfc_mq_destroy(struct lpfc_hba *phba, struct lpfc_queue *mq) | |||
| 12658 | uint32_t shdr_status, shdr_add_status; | 12734 | uint32_t shdr_status, shdr_add_status; |
| 12659 | union lpfc_sli4_cfg_shdr *shdr; | 12735 | union lpfc_sli4_cfg_shdr *shdr; |
| 12660 | 12736 | ||
| 12737 | /* sanity check on queue memory */ | ||
| 12661 | if (!mq) | 12738 | if (!mq) |
| 12662 | return -ENODEV; | 12739 | return -ENODEV; |
| 12663 | mbox = mempool_alloc(mq->phba->mbox_mem_pool, GFP_KERNEL); | 12740 | mbox = mempool_alloc(mq->phba->mbox_mem_pool, GFP_KERNEL); |
| @@ -12711,6 +12788,7 @@ lpfc_wq_destroy(struct lpfc_hba *phba, struct lpfc_queue *wq) | |||
| 12711 | uint32_t shdr_status, shdr_add_status; | 12788 | uint32_t shdr_status, shdr_add_status; |
| 12712 | union lpfc_sli4_cfg_shdr *shdr; | 12789 | union lpfc_sli4_cfg_shdr *shdr; |
| 12713 | 12790 | ||
| 12791 | /* sanity check on queue memory */ | ||
| 12714 | if (!wq) | 12792 | if (!wq) |
| 12715 | return -ENODEV; | 12793 | return -ENODEV; |
| 12716 | mbox = mempool_alloc(wq->phba->mbox_mem_pool, GFP_KERNEL); | 12794 | mbox = mempool_alloc(wq->phba->mbox_mem_pool, GFP_KERNEL); |
| @@ -12764,6 +12842,7 @@ lpfc_rq_destroy(struct lpfc_hba *phba, struct lpfc_queue *hrq, | |||
| 12764 | uint32_t shdr_status, shdr_add_status; | 12842 | uint32_t shdr_status, shdr_add_status; |
| 12765 | union lpfc_sli4_cfg_shdr *shdr; | 12843 | union lpfc_sli4_cfg_shdr *shdr; |
| 12766 | 12844 | ||
| 12845 | /* sanity check on queue memory */ | ||
| 12767 | if (!hrq || !drq) | 12846 | if (!hrq || !drq) |
| 12768 | return -ENODEV; | 12847 | return -ENODEV; |
| 12769 | mbox = mempool_alloc(hrq->phba->mbox_mem_pool, GFP_KERNEL); | 12848 | mbox = mempool_alloc(hrq->phba->mbox_mem_pool, GFP_KERNEL); |
diff --git a/drivers/scsi/lpfc/lpfc_sli4.h b/drivers/scsi/lpfc/lpfc_sli4.h index 7d444c444db4..3f266e2c54e0 100644 --- a/drivers/scsi/lpfc/lpfc_sli4.h +++ b/drivers/scsi/lpfc/lpfc_sli4.h | |||
| @@ -420,7 +420,16 @@ struct lpfc_sli4_hba { | |||
| 420 | void __iomem *STATUSregaddr; | 420 | void __iomem *STATUSregaddr; |
| 421 | void __iomem *CTRLregaddr; | 421 | void __iomem *CTRLregaddr; |
| 422 | void __iomem *ERR1regaddr; | 422 | void __iomem *ERR1regaddr; |
| 423 | #define SLIPORT_ERR1_REG_ERR_CODE_1 0x1 | ||
| 424 | #define SLIPORT_ERR1_REG_ERR_CODE_2 0x2 | ||
| 423 | void __iomem *ERR2regaddr; | 425 | void __iomem *ERR2regaddr; |
| 426 | #define SLIPORT_ERR2_REG_FW_RESTART 0x0 | ||
| 427 | #define SLIPORT_ERR2_REG_FUNC_PROVISON 0x1 | ||
| 428 | #define SLIPORT_ERR2_REG_FORCED_DUMP 0x2 | ||
| 429 | #define SLIPORT_ERR2_REG_FAILURE_EQ 0x3 | ||
| 430 | #define SLIPORT_ERR2_REG_FAILURE_CQ 0x4 | ||
| 431 | #define SLIPORT_ERR2_REG_FAILURE_BUS 0x5 | ||
| 432 | #define SLIPORT_ERR2_REG_FAILURE_RQ 0x6 | ||
| 424 | } if_type2; | 433 | } if_type2; |
| 425 | } u; | 434 | } u; |
| 426 | 435 | ||
