Pull in the fixes tree for a commit that missed 6.5. Also resolve a trivial merge conflict in fnic. * 6.5/scsi-fixes: (36 commits) scsi: storvsc: Handle additional SRB status values scsi: snic: Fix double free in snic_tgt_create() scsi: core: raid_class: Remove raid_component_add() scsi: ufs: ufs-qcom: Clear qunipro_g4_sel for HW major version > 5 scsi: ufs: mcq: Fix the search/wrap around logic scsi: qedf: Fix firmware halt over suspend and resume scsi: qedi: Fix firmware halt over suspend and resume scsi: qedi: Fix potential deadlock on &qedi_percpu->p_work_lock scsi: lpfc: Remove reftag check in DIF paths scsi: ufs: renesas: Fix private allocation scsi: snic: Fix possible memory leak if device_add() fails scsi: core: Fix possible memory leak if device_add() fails scsi: core: Fix legacy /proc parsing buffer overflow scsi: 53c700: Check that command slot is not NULL scsi: fnic: Replace return codes in fnic_clean_pending_aborts() scsi: storvsc: Fix handling of virtual Fibre Channel timeouts scsi: pm80xx: Fix error return code in pm8001_pci_probe() scsi: zfcp: Defer fc_rport blocking until after ADISC response scsi: storvsc: Limit max_sectors for virtual Fibre Channel devices scsi: sg: Fix checking return value of blk_get_queue() ...
Unified · Split
| @@ -994,7 +994,7 @@ Description: This file shows the amount of physical memory needed · 993 unmodified lines | ||
| 994 | 994 | What: /sys/bus/platform/drivers/ufshcd/*/rpm_lvl |
| 995 | 995 | What: /sys/bus/platform/devices/*.ufs/rpm_lvl |
| 996 | 996 | Date: September 2014 |
| 997 | −Contact: Subhash Jadavani <subhashj@codeaurora.org> | |
| 997 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 998 | 998 | Description: This entry could be used to set or show the UFS device |
| 999 | 999 | runtime power management level. The current driver |
| 1000 | 1000 | implementation supports 7 levels with next target states: |
| @@ -1021,7 +1021,7 @@ Description: This entry could be used to set or show the UFS device · 20 unmodified lines | ||
| 1021 | 1021 | What: /sys/bus/platform/drivers/ufshcd/*/rpm_target_dev_state |
| 1022 | 1022 | What: /sys/bus/platform/devices/*.ufs/rpm_target_dev_state |
| 1023 | 1023 | Date: February 2018 |
| 1024 | −Contact: Subhash Jadavani <subhashj@codeaurora.org> | |
| 1024 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1025 | 1025 | Description: This entry shows the target power mode of an UFS device |
| 1026 | 1026 | for the chosen runtime power management level. |
| 1027 | 1027 | |
| @@ -1030,7 +1030,7 @@ Description: This entry shows the target power mode of an UFS device · 2 unmodified lines | ||
| 1030 | 1030 | What: /sys/bus/platform/drivers/ufshcd/*/rpm_target_link_state |
| 1031 | 1031 | What: /sys/bus/platform/devices/*.ufs/rpm_target_link_state |
| 1032 | 1032 | Date: February 2018 |
| 1033 | −Contact: Subhash Jadavani <subhashj@codeaurora.org> | |
| 1033 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1034 | 1034 | Description: This entry shows the target state of an UFS UIC link |
| 1035 | 1035 | for the chosen runtime power management level. |
| 1036 | 1036 | |
| @@ -1039,7 +1039,7 @@ Description: This entry shows the target state of an UFS UIC link · 2 unmodified lines | ||
| 1039 | 1039 | What: /sys/bus/platform/drivers/ufshcd/*/spm_lvl |
| 1040 | 1040 | What: /sys/bus/platform/devices/*.ufs/spm_lvl |
| 1041 | 1041 | Date: September 2014 |
| 1042 | −Contact: Subhash Jadavani <subhashj@codeaurora.org> | |
| 1042 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1043 | 1043 | Description: This entry could be used to set or show the UFS device |
| 1044 | 1044 | system power management level. The current driver |
| 1045 | 1045 | implementation supports 7 levels with next target states: |
| @@ -1066,7 +1066,7 @@ Description: This entry could be used to set or show the UFS device · 20 unmodified lines | ||
| 1066 | 1066 | What: /sys/bus/platform/drivers/ufshcd/*/spm_target_dev_state |
| 1067 | 1067 | What: /sys/bus/platform/devices/*.ufs/spm_target_dev_state |
| 1068 | 1068 | Date: February 2018 |
| 1069 | −Contact: Subhash Jadavani <subhashj@codeaurora.org> | |
| 1069 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1070 | 1070 | Description: This entry shows the target power mode of an UFS device |
| 1071 | 1071 | for the chosen system power management level. |
| 1072 | 1072 | |
| @@ -1075,7 +1075,7 @@ Description: This entry shows the target power mode of an UFS device · 2 unmodified lines | ||
| 1075 | 1075 | What: /sys/bus/platform/drivers/ufshcd/*/spm_target_link_state |
| 1076 | 1076 | What: /sys/bus/platform/devices/*.ufs/spm_target_link_state |
| 1077 | 1077 | Date: February 2018 |
| 1078 | −Contact: Subhash Jadavani <subhashj@codeaurora.org> | |
| 1078 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1079 | 1079 | Description: This entry shows the target state of an UFS UIC link |
| 1080 | 1080 | for the chosen system power management level. |
| 1081 | 1081 | |
| @@ -1084,7 +1084,7 @@ Description: This entry shows the target state of an UFS UIC link · 2 unmodified lines | ||
| 1084 | 1084 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/monitor_enable |
| 1085 | 1085 | What: /sys/bus/platform/devices/*.ufs/monitor/monitor_enable |
| 1086 | 1086 | Date: January 2021 |
| 1087 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1087 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1088 | 1088 | Description: This file shows the status of performance monitor enablement |
| 1089 | 1089 | and it can be used to start/stop the monitor. When the monitor |
| 1090 | 1090 | is stopped, the performance data collected is also cleared. |
| @@ -1092,7 +1092,7 @@ Description: This file shows the status of performance monitor enablement · 1 unmodified line | ||
| 1092 | 1092 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/monitor_chunk_size |
| 1093 | 1093 | What: /sys/bus/platform/devices/*.ufs/monitor/monitor_chunk_size |
| 1094 | 1094 | Date: January 2021 |
| 1095 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1095 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1096 | 1096 | Description: This file tells the monitor to focus on requests transferring |
| 1097 | 1097 | data of specific chunk size (in Bytes). 0 means any chunk size. |
| 1098 | 1098 | It can only be changed when monitor is disabled. |
| @@ -1100,7 +1100,7 @@ Description: This file tells the monitor to focus on requests transferring · 1 unmodified line | ||
| 1100 | 1100 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_total_sectors |
| 1101 | 1101 | What: /sys/bus/platform/devices/*.ufs/monitor/read_total_sectors |
| 1102 | 1102 | Date: January 2021 |
| 1103 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1103 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1104 | 1104 | Description: This file shows how many sectors (in 512 Bytes) have been |
| 1105 | 1105 | sent from device to host after monitor gets started. |
| 1106 | 1106 | |
| @@ -1109,7 +1109,7 @@ Description: This file shows how many sectors (in 512 Bytes) have been · 2 unmodified lines | ||
| 1109 | 1109 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_total_busy |
| 1110 | 1110 | What: /sys/bus/platform/devices/*.ufs/monitor/read_total_busy |
| 1111 | 1111 | Date: January 2021 |
| 1112 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1112 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1113 | 1113 | Description: This file shows how long (in micro seconds) has been spent |
| 1114 | 1114 | sending data from device to host after monitor gets started. |
| 1115 | 1115 | |
| @@ -1118,7 +1118,7 @@ Description: This file shows how long (in micro seconds) has been spent · 2 unmodified lines | ||
| 1118 | 1118 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_nr_requests |
| 1119 | 1119 | What: /sys/bus/platform/devices/*.ufs/monitor/read_nr_requests |
| 1120 | 1120 | Date: January 2021 |
| 1121 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1121 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1122 | 1122 | Description: This file shows how many read requests have been sent after |
| 1123 | 1123 | monitor gets started. |
| 1124 | 1124 | |
| @@ -1127,7 +1127,7 @@ Description: This file shows how many read requests have been sent after · 2 unmodified lines | ||
| 1127 | 1127 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_req_latency_max |
| 1128 | 1128 | What: /sys/bus/platform/devices/*.ufs/monitor/read_req_latency_max |
| 1129 | 1129 | Date: January 2021 |
| 1130 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1130 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1131 | 1131 | Description: This file shows the maximum latency (in micro seconds) of |
| 1132 | 1132 | read requests after monitor gets started. |
| 1133 | 1133 | |
| @@ -1136,7 +1136,7 @@ Description: This file shows the maximum latency (in micro seconds) of · 2 unmodified lines | ||
| 1136 | 1136 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_req_latency_min |
| 1137 | 1137 | What: /sys/bus/platform/devices/*.ufs/monitor/read_req_latency_min |
| 1138 | 1138 | Date: January 2021 |
| 1139 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1139 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1140 | 1140 | Description: This file shows the minimum latency (in micro seconds) of |
| 1141 | 1141 | read requests after monitor gets started. |
| 1142 | 1142 | |
| @@ -1145,7 +1145,7 @@ Description: This file shows the minimum latency (in micro seconds) of · 2 unmodified lines | ||
| 1145 | 1145 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_req_latency_avg |
| 1146 | 1146 | What: /sys/bus/platform/devices/*.ufs/monitor/read_req_latency_avg |
| 1147 | 1147 | Date: January 2021 |
| 1148 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1148 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1149 | 1149 | Description: This file shows the average latency (in micro seconds) of |
| 1150 | 1150 | read requests after monitor gets started. |
| 1151 | 1151 | |
| @@ -1154,7 +1154,7 @@ Description: This file shows the average latency (in micro seconds) of · 2 unmodified lines | ||
| 1154 | 1154 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/read_req_latency_sum |
| 1155 | 1155 | What: /sys/bus/platform/devices/*.ufs/monitor/read_req_latency_sum |
| 1156 | 1156 | Date: January 2021 |
| 1157 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1157 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1158 | 1158 | Description: This file shows the total latency (in micro seconds) of |
| 1159 | 1159 | read requests sent after monitor gets started. |
| 1160 | 1160 | |
| @@ -1163,7 +1163,7 @@ Description: This file shows the total latency (in micro seconds) of · 2 unmodified lines | ||
| 1163 | 1163 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_total_sectors |
| 1164 | 1164 | What: /sys/bus/platform/devices/*.ufs/monitor/write_total_sectors |
| 1165 | 1165 | Date: January 2021 |
| 1166 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1166 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1167 | 1167 | Description: This file shows how many sectors (in 512 Bytes) have been sent |
| 1168 | 1168 | from host to device after monitor gets started. |
| 1169 | 1169 | |
| @@ -1172,7 +1172,7 @@ Description: This file shows how many sectors (in 512 Bytes) have been sent · 2 unmodified lines | ||
| 1172 | 1172 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_total_busy |
| 1173 | 1173 | What: /sys/bus/platform/devices/*.ufs/monitor/write_total_busy |
| 1174 | 1174 | Date: January 2021 |
| 1175 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1175 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1176 | 1176 | Description: This file shows how long (in micro seconds) has been spent |
| 1177 | 1177 | sending data from host to device after monitor gets started. |
| 1178 | 1178 | |
| @@ -1181,7 +1181,7 @@ Description: This file shows how long (in micro seconds) has been spent · 2 unmodified lines | ||
| 1181 | 1181 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_nr_requests |
| 1182 | 1182 | What: /sys/bus/platform/devices/*.ufs/monitor/write_nr_requests |
| 1183 | 1183 | Date: January 2021 |
| 1184 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1184 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1185 | 1185 | Description: This file shows how many write requests have been sent after |
| 1186 | 1186 | monitor gets started. |
| 1187 | 1187 | |
| @@ -1190,7 +1190,7 @@ Description: This file shows how many write requests have been sent after · 2 unmodified lines | ||
| 1190 | 1190 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_req_latency_max |
| 1191 | 1191 | What: /sys/bus/platform/devices/*.ufs/monitor/write_req_latency_max |
| 1192 | 1192 | Date: January 2021 |
| 1193 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1193 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1194 | 1194 | Description: This file shows the maximum latency (in micro seconds) of write |
| 1195 | 1195 | requests after monitor gets started. |
| 1196 | 1196 | |
| @@ -1199,7 +1199,7 @@ Description: This file shows the maximum latency (in micro seconds) of write · 2 unmodified lines | ||
| 1199 | 1199 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_req_latency_min |
| 1200 | 1200 | What: /sys/bus/platform/devices/*.ufs/monitor/write_req_latency_min |
| 1201 | 1201 | Date: January 2021 |
| 1202 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1202 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1203 | 1203 | Description: This file shows the minimum latency (in micro seconds) of write |
| 1204 | 1204 | requests after monitor gets started. |
| 1205 | 1205 | |
| @@ -1208,7 +1208,7 @@ Description: This file shows the minimum latency (in micro seconds) of write · 2 unmodified lines | ||
| 1208 | 1208 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_req_latency_avg |
| 1209 | 1209 | What: /sys/bus/platform/devices/*.ufs/monitor/write_req_latency_avg |
| 1210 | 1210 | Date: January 2021 |
| 1211 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1211 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1212 | 1212 | Description: This file shows the average latency (in micro seconds) of write |
| 1213 | 1213 | requests after monitor gets started. |
| 1214 | 1214 | |
| @@ -1217,7 +1217,7 @@ Description: This file shows the average latency (in micro seconds) of write · 2 unmodified lines | ||
| 1217 | 1217 | What: /sys/bus/platform/drivers/ufshcd/*/monitor/write_req_latency_sum |
| 1218 | 1218 | What: /sys/bus/platform/devices/*.ufs/monitor/write_req_latency_sum |
| 1219 | 1219 | Date: January 2021 |
| 1220 | −Contact: Can Guo <cang@codeaurora.org> | |
| 1220 | +Contact: Can Guo <quic_cang@quicinc.com> | |
| 1221 | 1221 | Description: This file shows the total latency (in micro seconds) of write |
| 1222 | 1222 | requests after monitor gets started. |
| 1223 | 1223 | |
| @@ -1226,7 +1226,7 @@ Description: This file shows the total latency (in micro seconds) of write · 2 unmodified lines | ||
| 1226 | 1226 | What: /sys/bus/platform/drivers/ufshcd/*/device_descriptor/wb_presv_us_en |
| 1227 | 1227 | What: /sys/bus/platform/devices/*.ufs/device_descriptor/wb_presv_us_en |
| 1228 | 1228 | Date: June 2020 |
| 1229 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1229 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1230 | 1230 | Description: This entry shows if preserve user-space was configured |
| 1231 | 1231 | |
| 1232 | 1232 | The file is read only. |
| @@ -1234,7 +1234,7 @@ Description: This entry shows if preserve user-space was configured · 1 unmodified line | ||
| 1234 | 1234 | What: /sys/bus/platform/drivers/ufshcd/*/device_descriptor/wb_shared_alloc_units |
| 1235 | 1235 | What: /sys/bus/platform/devices/*.ufs/device_descriptor/wb_shared_alloc_units |
| 1236 | 1236 | Date: June 2020 |
| 1237 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1237 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1238 | 1238 | Description: This entry shows the shared allocated units of WB buffer |
| 1239 | 1239 | |
| 1240 | 1240 | The file is read only. |
| @@ -1242,7 +1242,7 @@ Description: This entry shows the shared allocated units of WB buffer · 1 unmodified line | ||
| 1242 | 1242 | What: /sys/bus/platform/drivers/ufshcd/*/device_descriptor/wb_type |
| 1243 | 1243 | What: /sys/bus/platform/devices/*.ufs/device_descriptor/wb_type |
| 1244 | 1244 | Date: June 2020 |
| 1245 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1245 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1246 | 1246 | Description: This entry shows the configured WB type. |
| 1247 | 1247 | 0x1 for shared buffer mode. 0x0 for dedicated buffer mode. |
| 1248 | 1248 | |
| @@ -1251,7 +1251,7 @@ Description: This entry shows the configured WB type. · 2 unmodified lines | ||
| 1251 | 1251 | What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_buff_cap_adj |
| 1252 | 1252 | What: /sys/bus/platform/devices/*.ufs/geometry_descriptor/wb_buff_cap_adj |
| 1253 | 1253 | Date: June 2020 |
| 1254 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1254 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1255 | 1255 | Description: This entry shows the total user-space decrease in shared |
| 1256 | 1256 | buffer mode. |
| 1257 | 1257 | The value of this parameter is 3 for TLC NAND when SLC mode |
| @@ -1262,7 +1262,7 @@ Description: This entry shows the total user-space decrease in shared · 4 unmodified lines | ||
| 1262 | 1262 | What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_max_alloc_units |
| 1263 | 1263 | What: /sys/bus/platform/devices/*.ufs/geometry_descriptor/wb_max_alloc_units |
| 1264 | 1264 | Date: June 2020 |
| 1265 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1265 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1266 | 1266 | Description: This entry shows the Maximum total WriteBooster Buffer size |
| 1267 | 1267 | which is supported by the entire device. |
| 1268 | 1268 | |
| @@ -1271,7 +1271,7 @@ Description: This entry shows the Maximum total WriteBooster Buffer size · 2 unmodified lines | ||
| 1271 | 1271 | What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_max_wb_luns |
| 1272 | 1272 | What: /sys/bus/platform/devices/*.ufs/geometry_descriptor/wb_max_wb_luns |
| 1273 | 1273 | Date: June 2020 |
| 1274 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1274 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1275 | 1275 | Description: This entry shows the maximum number of luns that can support |
| 1276 | 1276 | WriteBooster. |
| 1277 | 1277 | |
| @@ -1280,7 +1280,7 @@ Description: This entry shows the maximum number of luns that can support · 2 unmodified lines | ||
| 1280 | 1280 | What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_sup_red_type |
| 1281 | 1281 | What: /sys/bus/platform/devices/*.ufs/geometry_descriptor/wb_sup_red_type |
| 1282 | 1282 | Date: June 2020 |
| 1283 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1283 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1284 | 1284 | Description: The supportability of user space reduction mode |
| 1285 | 1285 | and preserve user space mode. |
| 1286 | 1286 | 00h: WriteBooster Buffer can be configured only in |
| @@ -1295,7 +1295,7 @@ Description: The supportability of user space reduction mode · 8 unmodified lines | ||
| 1295 | 1295 | What: /sys/bus/platform/drivers/ufshcd/*/geometry_descriptor/wb_sup_wb_type |
| 1296 | 1296 | What: /sys/bus/platform/devices/*.ufs/geometry_descriptor/wb_sup_wb_type |
| 1297 | 1297 | Date: June 2020 |
| 1298 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1298 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1299 | 1299 | Description: The supportability of WriteBooster Buffer type. |
| 1300 | 1300 | |
| 1301 | 1301 | === ========================================================== |
| @@ -1310,7 +1310,7 @@ Description: The supportability of WriteBooster Buffer type. · 8 unmodified lines | ||
| 1310 | 1310 | What: /sys/bus/platform/drivers/ufshcd/*/flags/wb_enable |
| 1311 | 1311 | What: /sys/bus/platform/devices/*.ufs/flags/wb_enable |
| 1312 | 1312 | Date: June 2020 |
| 1313 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1313 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1314 | 1314 | Description: This entry shows the status of WriteBooster. |
| 1315 | 1315 | |
| 1316 | 1316 | == ============================ |
| @@ -1323,7 +1323,7 @@ Description: This entry shows the status of WriteBooster. · 6 unmodified lines | ||
| 1323 | 1323 | What: /sys/bus/platform/drivers/ufshcd/*/flags/wb_flush_en |
| 1324 | 1324 | What: /sys/bus/platform/devices/*.ufs/flags/wb_flush_en |
| 1325 | 1325 | Date: June 2020 |
| 1326 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1326 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1327 | 1327 | Description: This entry shows if flush is enabled. |
| 1328 | 1328 | |
| 1329 | 1329 | == ================================= |
| @@ -1336,7 +1336,7 @@ Description: This entry shows if flush is enabled. · 6 unmodified lines | ||
| 1336 | 1336 | What: /sys/bus/platform/drivers/ufshcd/*/flags/wb_flush_during_h8 |
| 1337 | 1337 | What: /sys/bus/platform/devices/*.ufs/flags/wb_flush_during_h8 |
| 1338 | 1338 | Date: June 2020 |
| 1339 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1339 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1340 | 1340 | Description: Flush WriteBooster Buffer during hibernate state. |
| 1341 | 1341 | |
| 1342 | 1342 | == ================================================= |
| @@ -1351,7 +1351,7 @@ Description: Flush WriteBooster Buffer during hibernate state. · 8 unmodified lines | ||
| 1351 | 1351 | What: /sys/bus/platform/drivers/ufshcd/*/attributes/wb_avail_buf |
| 1352 | 1352 | What: /sys/bus/platform/devices/*.ufs/attributes/wb_avail_buf |
| 1353 | 1353 | Date: June 2020 |
| 1354 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1354 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1355 | 1355 | Description: This entry shows the amount of unused WriteBooster buffer |
| 1356 | 1356 | available. |
| 1357 | 1357 | |
| @@ -1360,7 +1360,7 @@ Description: This entry shows the amount of unused WriteBooster buffer · 2 unmodified lines | ||
| 1360 | 1360 | What: /sys/bus/platform/drivers/ufshcd/*/attributes/wb_cur_buf |
| 1361 | 1361 | What: /sys/bus/platform/devices/*.ufs/attributes/wb_cur_buf |
| 1362 | 1362 | Date: June 2020 |
| 1363 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1363 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1364 | 1364 | Description: This entry shows the amount of unused current buffer. |
| 1365 | 1365 | |
| 1366 | 1366 | The file is read only. |
| @@ -1368,7 +1368,7 @@ Description: This entry shows the amount of unused current buffer. · 1 unmodified line | ||
| 1368 | 1368 | What: /sys/bus/platform/drivers/ufshcd/*/attributes/wb_flush_status |
| 1369 | 1369 | What: /sys/bus/platform/devices/*.ufs/attributes/wb_flush_status |
| 1370 | 1370 | Date: June 2020 |
| 1371 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1371 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1372 | 1372 | Description: This entry shows the flush operation status. |
| 1373 | 1373 | |
| 1374 | 1374 | |
| @@ -1385,7 +1385,7 @@ Description: This entry shows the flush operation status. · 10 unmodified lines | ||
| 1385 | 1385 | What: /sys/bus/platform/drivers/ufshcd/*/attributes/wb_life_time_est |
| 1386 | 1386 | What: /sys/bus/platform/devices/*.ufs/attributes/wb_life_time_est |
| 1387 | 1387 | Date: June 2020 |
| 1388 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1388 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1389 | 1389 | Description: This entry shows an indication of the WriteBooster Buffer |
| 1390 | 1390 | lifetime based on the amount of performed program/erase cycles |
| 1391 | 1391 | |
| @@ -1399,7 +1399,7 @@ Description: This entry shows an indication of the WriteBooster Buffer · 7 unmodified lines | ||
| 1399 | 1399 | |
| 1400 | 1400 | What: /sys/class/scsi_device/*/device/unit_descriptor/wb_buf_alloc_units |
| 1401 | 1401 | Date: June 2020 |
| 1402 | −Contact: Asutosh Das <asutoshd@codeaurora.org> | |
| 1402 | +Contact: Asutosh Das <quic_asutoshd@quicinc.com> | |
| 1403 | 1403 | Description: This entry shows the configured size of WriteBooster buffer. |
| 1404 | 1404 | 0400h corresponds to 4GB. |
| 1405 | 1405 | |
| @@ -442,7 +442,6 @@ struct blk_revalidate_zone_args { · 441 unmodified lines | ||
| 442 | 442 | unsigned long *conv_zones_bitmap; |
| 443 | 443 | unsigned long *seq_zones_wlock; |
| 444 | 444 | unsigned int nr_zones; |
| 445 | − sector_t zone_sectors; | |
| 446 | 445 | sector_t sector; |
| 447 | 446 | }; |
| 448 | 447 | |
| @@ -456,38 +455,34 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx, · 7 unmodified lines | ||
| 456 | 455 | struct gendisk *disk = args->disk; |
| 457 | 456 | struct request_queue *q = disk->queue; |
| 458 | 457 | sector_t capacity = get_capacity(disk); |
| 458 | + sector_t zone_sectors = q->limits.chunk_sectors; | |
| 459 | + | |
| 460 | + /* Check for bad zones and holes in the zone report */ | |
| 461 | + if (zone->start != args->sector) { | |
| 462 | + pr_warn("%s: Zone gap at sectors %llu..%llu\n", | |
| 463 | + disk->disk_name, args->sector, zone->start); | |
| 464 | + return -ENODEV; | |
| 465 | + } | |
| 466 | + | |
| 467 | + if (zone->start >= capacity || !zone->len) { | |
| 468 | + pr_warn("%s: Invalid zone start %llu, length %llu\n", | |
| 469 | + disk->disk_name, zone->start, zone->len); | |
| 470 | + return -ENODEV; | |
| 471 | + } | |
| 459 | 472 | |
| 460 | 473 | /* |
| 461 | 474 | * All zones must have the same size, with the exception on an eventual |
| 462 | 475 | * smaller last zone. |
| 463 | 476 | */ |
| 464 | − if (zone->start == 0) { | |
| 465 | − if (zone->len == 0 || !is_power_of_2(zone->len)) { | |
| 466 | − pr_warn("%s: Invalid zoned device with non power of two zone size (%llu)\n", | |
| 467 | − disk->disk_name, zone->len); | |
| 468 | − return -ENODEV; | |
| 469 | − } | |
| 470 | − | |
| 471 | − args->zone_sectors = zone->len; | |
| 472 | − args->nr_zones = (capacity + zone->len - 1) >> ilog2(zone->len); | |
| 473 | − } else if (zone->start + args->zone_sectors < capacity) { | |
| 474 | − if (zone->len != args->zone_sectors) { | |
| 477 | + if (zone->start + zone->len < capacity) { | |
| 478 | + if (zone->len != zone_sectors) { | |
| 475 | 479 | pr_warn("%s: Invalid zoned device with non constant zone size\n", |
| 476 | 480 | disk->disk_name); |
| 477 | 481 | return -ENODEV; |
| 478 | 482 | } |
| 479 | − } else { | |
| 480 | − if (zone->len > args->zone_sectors) { | |
| 481 | − pr_warn("%s: Invalid zoned device with larger last zone size\n", | |
| 482 | − disk->disk_name); | |
| 483 | − return -ENODEV; | |
| 484 | − } | |
| 485 | − } | |
| 486 | − | |
| 487 | − /* Check for holes in the zone report */ | |
| 488 | − if (zone->start != args->sector) { | |
| 489 | − pr_warn("%s: Zone gap at sectors %llu..%llu\n", | |
| 490 | − disk->disk_name, args->sector, zone->start); | |
| 483 | + } else if (zone->len > zone_sectors) { | |
| 484 | + pr_warn("%s: Invalid zoned device with larger last zone size\n", | |
| 485 | + disk->disk_name); | |
| 491 | 486 | return -ENODEV; |
| 492 | 487 | } |
| 493 | 488 | |
| @@ -526,11 +521,13 @@ static int blk_revalidate_zone_cb(struct blk_zone *zone, unsigned int idx, · 32 unmodified lines | ||
| 526 | 521 | * @disk: Target disk |
| 527 | 522 | * @update_driver_data: Callback to update driver data on the frozen disk |
| 528 | 523 | * |
| 529 | − * Helper function for low-level device drivers to (re) allocate and initialize | |
| 530 | − * a disk request queue zone bitmaps. This functions should normally be called | |
| 531 | − * within the disk ->revalidate method for blk-mq based drivers. For BIO based | |
| 532 | − * drivers only q->nr_zones needs to be updated so that the sysfs exposed value | |
| 533 | − * is correct. | |
| 524 | + * Helper function for low-level device drivers to check and (re) allocate and | |
| 525 | + * initialize a disk request queue zone bitmaps. This functions should normally | |
| 526 | + * be called within the disk ->revalidate method for blk-mq based drivers. | |
| 527 | + * Before calling this function, the device driver must already have set the | |
| 528 | + * device zone size (chunk_sector limit) and the max zone append limit. | |
| 529 | + * For BIO based drivers, this function cannot be used. BIO based device drivers | |
| 530 | + * only need to set disk->nr_zones so that the sysfs exposed value is correct. | |
| 534 | 531 | * If the @update_driver_data callback function is not NULL, the callback is |
| 535 | 532 | * executed with the device request queue frozen after all zones have been |
| 536 | 533 | * checked. |
| @@ -539,9 +536,9 @@ int blk_revalidate_disk_zones(struct gendisk *disk, · 2 unmodified lines | ||
| 539 | 536 | void (*update_driver_data)(struct gendisk *disk)) |
| 540 | 537 | { |
| 541 | 538 | struct request_queue *q = disk->queue; |
| 542 | − struct blk_revalidate_zone_args args = { | |
| 543 | − .disk = disk, | |
| 544 | − }; | |
| 539 | + sector_t zone_sectors = q->limits.chunk_sectors; | |
| 540 | + sector_t capacity = get_capacity(disk); | |
| 541 | + struct blk_revalidate_zone_args args = { }; | |
| 545 | 542 | unsigned int noio_flag; |
| 546 | 543 | int ret; |
| 547 | 544 | |
| @@ -550,13 +547,31 @@ int blk_revalidate_disk_zones(struct gendisk *disk, · 2 unmodified lines | ||
| 550 | 547 | if (WARN_ON_ONCE(!queue_is_mq(q))) |
| 551 | 548 | return -EIO; |
| 552 | 549 | |
| 553 | − if (!get_capacity(disk)) | |
| 554 | − return -EIO; | |
| 550 | + if (!capacity) | |
| 551 | + return -ENODEV; | |
| 552 | + | |
| 553 | + /* | |
| 554 | + * Checks that the device driver indicated a valid zone size and that | |
| 555 | + * the max zone append limit is set. | |
| 556 | + */ | |
| 557 | + if (!zone_sectors || !is_power_of_2(zone_sectors)) { | |
| 558 | + pr_warn("%s: Invalid non power of two zone size (%llu)\n", | |
| 559 | + disk->disk_name, zone_sectors); | |
| 560 | + return -ENODEV; | |
| 561 | + } | |
| 562 | + | |
| 563 | + if (!q->limits.max_zone_append_sectors) { | |
| 564 | + pr_warn("%s: Invalid 0 maximum zone append limit\n", | |
| 565 | + disk->disk_name); | |
| 566 | + return -ENODEV; | |
| 567 | + } | |
| 555 | 568 | |
| 556 | 569 | /* |
| 557 | 570 | * Ensure that all memory allocations in this context are done as if |
| 558 | 571 | * GFP_NOIO was specified. |
| 559 | 572 | */ |
| 573 | + args.disk = disk; | |
| 574 | + args.nr_zones = (capacity + zone_sectors - 1) >> ilog2(zone_sectors); | |
| 560 | 575 | noio_flag = memalloc_noio_save(); |
| 561 | 576 | ret = disk->fops->report_zones(disk, 0, UINT_MAX, |
| 562 | 577 | blk_revalidate_zone_cb, &args); |
| @@ -570,7 +585,7 @@ int blk_revalidate_disk_zones(struct gendisk *disk, · 7 unmodified lines | ||
| 570 | 585 | * If zones where reported, make sure that the entire disk capacity |
| 571 | 586 | * has been checked. |
| 572 | 587 | */ |
| 573 | − if (ret > 0 && args.sector != get_capacity(disk)) { | |
| 588 | + if (ret > 0 && args.sector != capacity) { | |
| 574 | 589 | pr_warn("%s: Missing zones from sector %llu\n", |
| 575 | 590 | disk->disk_name, args.sector); |
| 576 | 591 | ret = -ENODEV; |
| @@ -583,7 +598,6 @@ int blk_revalidate_disk_zones(struct gendisk *disk, · 6 unmodified lines | ||
| 583 | 598 | */ |
| 584 | 599 | blk_mq_freeze_queue(q); |
| 585 | 600 | if (ret > 0) { |
| 586 | − blk_queue_chunk_sectors(q, args.zone_sectors); | |
| 587 | 601 | disk->nr_zones = args.nr_zones; |
| 588 | 602 | swap(disk->seq_zones_wlock, args.seq_zones_wlock); |
| 589 | 603 | swap(disk->conv_zones_bitmap, args.conv_zones_bitmap); |
| @@ -162,21 +162,15 @@ int null_register_zoned_dev(struct nullb *nullb) · 161 unmodified lines | ||
| 162 | 162 | disk_set_zoned(nullb->disk, BLK_ZONED_HM); |
| 163 | 163 | blk_queue_flag_set(QUEUE_FLAG_ZONE_RESETALL, q); |
| 164 | 164 | blk_queue_required_elevator_features(q, ELEVATOR_F_ZBD_SEQ_WRITE); |
| 165 | − | |
| 166 | − if (queue_is_mq(q)) { | |
| 167 | − int ret = blk_revalidate_disk_zones(nullb->disk, NULL); | |
| 168 | − | |
| 169 | − if (ret) | |
| 170 | − return ret; | |
| 171 | − } else { | |
| 172 | − blk_queue_chunk_sectors(q, dev->zone_size_sects); | |
| 173 | − nullb->disk->nr_zones = bdev_nr_zones(nullb->disk->part0); | |
| 174 | − } | |
| 175 | − | |
| 165 | + blk_queue_chunk_sectors(q, dev->zone_size_sects); | |
| 166 | + nullb->disk->nr_zones = bdev_nr_zones(nullb->disk->part0); | |
| 176 | 167 | blk_queue_max_zone_append_sectors(q, dev->zone_size_sects); |
| 177 | 168 | disk_set_max_open_zones(nullb->disk, dev->zone_max_open); |
| 178 | 169 | disk_set_max_active_zones(nullb->disk, dev->zone_max_active); |
| 179 | 170 | |
| 171 | + if (queue_is_mq(q)) | |
| 172 | + return blk_revalidate_disk_zones(nullb->disk, NULL); | |
| 173 | + | |
| 180 | 174 | return 0; |
| 181 | 175 | } |
| 182 | 176 | |
| @@ -751,7 +751,6 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev, · 750 unmodified lines | ||
| 751 | 751 | { |
| 752 | 752 | u32 v, wg; |
| 753 | 753 | u8 model; |
| 754 | − int ret; | |
| 755 | 754 | |
| 756 | 755 | virtio_cread(vdev, struct virtio_blk_config, |
| 757 | 756 | zoned.model, &model); |
| @@ -806,6 +805,7 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev, · 48 unmodified lines | ||
| 806 | 805 | vblk->zone_sectors); |
| 807 | 806 | return -ENODEV; |
| 808 | 807 | } |
| 808 | + blk_queue_chunk_sectors(q, vblk->zone_sectors); | |
| 809 | 809 | dev_dbg(&vdev->dev, "zone sectors = %u\n", vblk->zone_sectors); |
| 810 | 810 | |
| 811 | 811 | if (virtio_has_feature(vdev, VIRTIO_BLK_F_DISCARD)) { |
| @@ -814,26 +814,22 @@ static int virtblk_probe_zoned_device(struct virtio_device *vdev, · 2 unmodified lines | ||
| 814 | 814 | blk_queue_max_discard_sectors(q, 0); |
| 815 | 815 | } |
| 816 | 816 | |
| 817 | − ret = blk_revalidate_disk_zones(vblk->disk, NULL); | |
| 818 | − if (!ret) { | |
| 819 | − virtio_cread(vdev, struct virtio_blk_config, | |
| 820 | − zoned.max_append_sectors, &v); | |
| 821 | − if (!v) { | |
| 822 | − dev_warn(&vdev->dev, "zero max_append_sectors reported\n"); | |
| 823 | − return -ENODEV; | |
| 824 | − } | |
| 825 | − if ((v << SECTOR_SHIFT) < wg) { | |
| 826 | − dev_err(&vdev->dev, | |
| 827 | − "write granularity %u exceeds max_append_sectors %u limit\n", | |
| 828 | − wg, v); | |
| 829 | − return -ENODEV; | |
| 830 | − } | |
| 831 | − | |
| 832 | − blk_queue_max_zone_append_sectors(q, v); | |
| 833 | − dev_dbg(&vdev->dev, "max append sectors = %u\n", v); | |
| 817 | + virtio_cread(vdev, struct virtio_blk_config, | |
| 818 | + zoned.max_append_sectors, &v); | |
| 819 | + if (!v) { | |
| 820 | + dev_warn(&vdev->dev, "zero max_append_sectors reported\n"); | |
| 821 | + return -ENODEV; | |
| 822 | + } | |
| 823 | + if ((v << SECTOR_SHIFT) < wg) { | |
| 824 | + dev_err(&vdev->dev, | |
| 825 | + "write granularity %u exceeds max_append_sectors %u limit\n", | |
| 826 | + wg, v); | |
| 827 | + return -ENODEV; | |
| 834 | 828 | } |
| 829 | + blk_queue_max_zone_append_sectors(q, v); | |
| 830 | + dev_dbg(&vdev->dev, "max append sectors = %u\n", v); | |
| 835 | 831 | |
| 836 | − return ret; | |
| 832 | + return blk_revalidate_disk_zones(vblk->disk, NULL); | |
| 837 | 833 | } |
| 838 | 834 | |
| 839 | 835 | #else |
| @@ -10,12 +10,11 @@ · 9 unmodified lines | ||
| 10 | 10 | int nvme_revalidate_zones(struct nvme_ns *ns) |
| 11 | 11 | { |
| 12 | 12 | struct request_queue *q = ns->queue; |
| 13 | − int ret; | |
| 14 | 13 | |
| 15 | − ret = blk_revalidate_disk_zones(ns->disk, NULL); | |
| 16 | − if (!ret) | |
| 17 | − blk_queue_max_zone_append_sectors(q, ns->ctrl->max_zone_append); | |
| 18 | − return ret; | |
| 14 | + blk_queue_chunk_sectors(q, ns->zsze); | |
| 15 | + blk_queue_max_zone_append_sectors(q, ns->ctrl->max_zone_append); | |
| 16 | + | |
| 17 | + return blk_revalidate_disk_zones(ns->disk, NULL); | |
| 19 | 18 | } |
| 20 | 19 | |
| 21 | 20 | static int nvme_set_max_append(struct nvme_ctrl *ctrl) |
| @@ -534,8 +534,7 @@ static void zfcp_fc_adisc_handler(void *data) · 533 unmodified lines | ||
| 534 | 534 | |
| 535 | 535 | /* re-init to undo drop from zfcp_fc_adisc() */ |
| 536 | 536 | port->d_id = ntoh24(adisc_resp->adisc_port_id); |
| 537 | − /* port is good, unblock rport without going through erp */ | |
| 538 | − zfcp_scsi_schedule_rport_register(port); | |
| 537 | + /* port is still good, nothing to do */ | |
| 539 | 538 | out: |
| 540 | 539 | atomic_andnot(ZFCP_STATUS_PORT_LINK_TEST, &port->status); |
| 541 | 540 | put_device(&port->dev); |
| @@ -595,9 +594,6 @@ void zfcp_fc_link_test_work(struct work_struct *work) · 53 unmodified lines | ||
| 595 | 594 | int retval; |
| 596 | 595 | |
| 597 | 596 | set_worker_desc("zadisc%16llx", port->wwpn); /* < WORKER_DESC_LEN=24 */ |
| 598 | − get_device(&port->dev); | |
| 599 | − port->rport_task = RPORT_DEL; | |
| 600 | − zfcp_scsi_rport_work(&port->rport_work); | |
| 601 | 597 | |
| 602 | 598 | /* only issue one test command at one time per port */ |
| 603 | 599 | if (atomic_read(&port->status) & ZFCP_STATUS_PORT_LINK_TEST) |
| @@ -1598,7 +1598,7 @@ NCR_700_intr(int irq, void *dev_id) · 1597 unmodified lines | ||
| 1598 | 1598 | printk("scsi%d (%d:%d) PHASE MISMATCH IN SEND MESSAGE %d remain, return %p[%04x], phase %s\n", host->host_no, pun, lun, count, (void *)temp, temp - hostdata->pScript, sbcl_to_string(NCR_700_readb(host, SBCL_REG))); |
| 1599 | 1599 | #endif |
| 1600 | 1600 | resume_offset = hostdata->pScript + Ent_SendMessagePhaseMismatch; |
| 1601 | − } else if(dsp >= to32bit(&slot->pSG[0].ins) && | |
| 1601 | + } else if (slot && dsp >= to32bit(&slot->pSG[0].ins) && | |
| 1602 | 1602 | dsp <= to32bit(&slot->pSG[NCR_700_SG_SEGMENTS].ins)) { |
| 1603 | 1603 | int data_transfer = NCR_700_readl(host, DBC_REG) & 0xffffff; |
| 1604 | 1604 | int SGcount = (dsp - to32bit(&slot->pSG[0].ins))/sizeof(struct NCR_700_SG_List); |
| @@ -2618,7 +2618,7 @@ struct aac_hba_info { · 2617 unmodified lines | ||
| 2618 | 2618 | struct aac_aifcmd { |
| 2619 | 2619 | __le32 command; /* Tell host what type of notify this is */ |
| 2620 | 2620 | __le32 seqnum; /* To allow ordering of reports (if necessary) */ |
| 2621 | − u8 data[1]; /* Undefined length (from kernel viewpoint) */ | |
| 2621 | + u8 data[]; /* Undefined length (from kernel viewpoint) */ | |
| 2622 | 2622 | }; |
| 2623 | 2623 | |
| 2624 | 2624 | /** |
| @@ -2139,7 +2139,7 @@ static int fnic_clean_pending_aborts(struct fnic *fnic, · 2138 unmodified lines | ||
| 2139 | 2139 | bool new_sc) |
| 2140 | 2140 | |
| 2141 | 2141 | { |
| 2142 | − int ret = SUCCESS; | |
| 2142 | + int ret = 0; | |
| 2143 | 2143 | struct fnic_pending_aborts_iter_data iter_data = { |
| 2144 | 2144 | .fnic = fnic, |
| 2145 | 2145 | .lun_dev = lr_sc->device, |
| @@ -2159,9 +2159,11 @@ static int fnic_clean_pending_aborts(struct fnic *fnic, · 13 unmodified lines | ||
| 2159 | 2159 | |
| 2160 | 2160 | /* walk again to check, if IOs are still pending in fw */ |
| 2161 | 2161 | if (fnic_is_abts_pending(fnic, lr_sc)) |
| 2162 | − ret = FAILED; | |
| 2162 | + ret = 1; | |
| 2163 | 2163 | |
| 2164 | 2164 | clean_pending_aborts_end: |
| 2165 | + FNIC_SCSI_DBG(KERN_INFO, fnic->lport->host, | |
| 2166 | + "%s: exit status: %d\n", __func__, ret); | |
| 2165 | 2167 | return ret; |
| 2166 | 2168 | } |
| 2167 | 2169 | |
| @@ -465,7 +465,7 @@ int fnic_trace_buf_init(void) · 464 unmodified lines | ||
| 465 | 465 | fnic_max_trace_entries = (trace_max_pages * PAGE_SIZE)/ |
| 466 | 466 | FNIC_ENTRY_SIZE_BYTES; |
| 467 | 467 | |
| 468 | − fnic_trace_buf_p = (unsigned long)vzalloc(trace_max_pages * PAGE_SIZE); | |
| 468 | + fnic_trace_buf_p = (unsigned long)vcalloc(trace_max_pages, PAGE_SIZE); | |
| 469 | 469 | if (!fnic_trace_buf_p) { |
| 470 | 470 | printk(KERN_ERR PFX "Failed to allocate memory " |
| 471 | 471 | "for fnic_trace_buf_p\n"); |
| @@ -6971,7 +6971,9 @@ lpfc_unregister_fcf_rescan(struct lpfc_hba *phba) · 6970 unmodified lines | ||
| 6971 | 6971 | if (rc) |
| 6972 | 6972 | return; |
| 6973 | 6973 | /* Reset HBA FCF states after successful unregister FCF */ |
| 6974 | + spin_lock_irq(&phba->hbalock); | |
| 6974 | 6975 | phba->fcf.fcf_flag = 0; |
| 6976 | + spin_unlock_irq(&phba->hbalock); | |
| 6975 | 6977 | phba->fcf.current_rec.flag = 0; |
| 6976 | 6978 | |
| 6977 | 6979 | /* |
| @@ -109,8 +109,6 @@ lpfc_sli4_set_rsp_sgl_last(struct lpfc_hba *phba, · 108 unmodified lines | ||
| 109 | 109 | } |
| 110 | 110 | } |
| 111 | 111 | |
| 112 | −#define LPFC_INVALID_REFTAG ((u32)-1) | |
| 113 | − | |
| 114 | 112 | /** |
| 115 | 113 | * lpfc_rampdown_queue_depth - Post RAMP_DOWN_QUEUE event to worker thread |
| 116 | 114 | * @phba: The Hba for which this call is being executed. |
| @@ -978,8 +976,6 @@ lpfc_bg_err_inject(struct lpfc_hba *phba, struct scsi_cmnd *sc, · 861 unmodified lines | ||
| 978 | 976 | |
| 979 | 977 | sgpe = scsi_prot_sglist(sc); |
| 980 | 978 | lba = scsi_prot_ref_tag(sc); |
| 981 | − if (lba == LPFC_INVALID_REFTAG) | |
| 982 | − return 0; | |
| 983 | 979 | |
| 984 | 980 | /* First check if we need to match the LBA */ |
| 985 | 981 | if (phba->lpfc_injerr_lba != LPFC_INJERR_LBA_OFF) { |
| @@ -1560,8 +1556,6 @@ lpfc_bg_setup_bpl(struct lpfc_hba *phba, struct scsi_cmnd *sc, · 574 unmodified lines | ||
| 1560 | 1556 | |
| 1561 | 1557 | /* extract some info from the scsi command for pde*/ |
| 1562 | 1558 | reftag = scsi_prot_ref_tag(sc); |
| 1563 | − if (reftag == LPFC_INVALID_REFTAG) | |
| 1564 | − goto out; | |
| 1565 | 1559 | |
| 1566 | 1560 | #ifdef CONFIG_SCSI_LPFC_DEBUG_FS |
| 1567 | 1561 | rc = lpfc_bg_err_inject(phba, sc, &reftag, NULL, 1); |
| @@ -1723,8 +1717,6 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, · 155 unmodified lines | ||
| 1723 | 1717 | /* extract some info from the scsi command */ |
| 1724 | 1718 | blksize = scsi_prot_interval(sc); |
| 1725 | 1719 | reftag = scsi_prot_ref_tag(sc); |
| 1726 | − if (reftag == LPFC_INVALID_REFTAG) | |
| 1727 | − goto out; | |
| 1728 | 1720 | |
| 1729 | 1721 | #ifdef CONFIG_SCSI_LPFC_DEBUG_FS |
| 1730 | 1722 | rc = lpfc_bg_err_inject(phba, sc, &reftag, NULL, 1); |
| @@ -1953,8 +1945,6 @@ lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc, · 222 unmodified lines | ||
| 1953 | 1945 | |
| 1954 | 1946 | /* extract some info from the scsi command for pde*/ |
| 1955 | 1947 | reftag = scsi_prot_ref_tag(sc); |
| 1956 | − if (reftag == LPFC_INVALID_REFTAG) | |
| 1957 | − goto out; | |
| 1958 | 1948 | |
| 1959 | 1949 | #ifdef CONFIG_SCSI_LPFC_DEBUG_FS |
| 1960 | 1950 | rc = lpfc_bg_err_inject(phba, sc, &reftag, NULL, 1); |
| @@ -2154,8 +2144,6 @@ lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc, · 193 unmodified lines | ||
| 2154 | 2144 | /* extract some info from the scsi command */ |
| 2155 | 2145 | blksize = scsi_prot_interval(sc); |
| 2156 | 2146 | reftag = scsi_prot_ref_tag(sc); |
| 2157 | − if (reftag == LPFC_INVALID_REFTAG) | |
| 2158 | − goto out; | |
| 2159 | 2147 | |
| 2160 | 2148 | #ifdef CONFIG_SCSI_LPFC_DEBUG_FS |
| 2161 | 2149 | rc = lpfc_bg_err_inject(phba, sc, &reftag, NULL, 1); |
| @@ -2746,8 +2734,6 @@ lpfc_calc_bg_err(struct lpfc_hba *phba, struct lpfc_io_buf *lpfc_cmd) · 584 unmodified lines | ||
| 2746 | 2734 | |
| 2747 | 2735 | src = (struct scsi_dif_tuple *)sg_virt(sgpe); |
| 2748 | 2736 | start_ref_tag = scsi_prot_ref_tag(cmd); |
| 2749 | − if (start_ref_tag == LPFC_INVALID_REFTAG) | |
| 2750 | − goto out; | |
| 2751 | 2737 | start_app_tag = src->app_tag; |
| 2752 | 2738 | len = sgpe->length; |
| 2753 | 2739 | while (src && protsegcnt) { |
| @@ -3493,11 +3479,11 @@ err: · 739 unmodified lines | ||
| 3493 | 3479 | scsi_cmnd->sc_data_direction); |
| 3494 | 3480 | |
| 3495 | 3481 | lpfc_printf_log(phba, KERN_ERR, LOG_TRACE_EVENT, |
| 3496 | − "9084 Cannot setup S/G List for HBA" | |
| 3497 | − "IO segs %d/%d SGL %d SCSI %d: %d %d\n", | |
| 3482 | + "9084 Cannot setup S/G List for HBA " | |
| 3483 | + "IO segs %d/%d SGL %d SCSI %d: %d %d %d\n", | |
| 3498 | 3484 | lpfc_cmd->seg_cnt, lpfc_cmd->prot_seg_cnt, |
| 3499 | 3485 | phba->cfg_total_seg_cnt, phba->cfg_sg_seg_cnt, |
| 3500 | − prot_group_type, num_sge); | |
| 3486 | + prot_group_type, num_sge, ret); | |
| 3501 | 3487 | |
| 3502 | 3488 | lpfc_cmd->seg_cnt = 0; |
| 3503 | 3489 | lpfc_cmd->prot_seg_cnt = 0; |
| @@ -1178,7 +1178,8 @@ static int pm8001_pci_probe(struct pci_dev *pdev, · 1177 unmodified lines | ||
| 1178 | 1178 | pm80xx_set_thermal_config(pm8001_ha); |
| 1179 | 1179 | } |
| 1180 | 1180 | |
| 1181 | − if (pm8001_init_sas_add(pm8001_ha)) | |
| 1181 | + rc = pm8001_init_sas_add(pm8001_ha); | |
| 1182 | + if (rc) | |
| 1182 | 1183 | goto err_out_shost; |
| 1183 | 1184 | /* phy setting support for motherboard controller */ |
| 1184 | 1185 | rc = pm8001_configure_phy_settings(pm8001_ha); |
| @@ -31,6 +31,7 @@ static void qedf_remove(struct pci_dev *pdev); · 30 unmodified lines | ||
| 31 | 31 | static void qedf_shutdown(struct pci_dev *pdev); |
| 32 | 32 | static void qedf_schedule_recovery_handler(void *dev); |
| 33 | 33 | static void qedf_recovery_handler(struct work_struct *work); |
| 34 | +static int qedf_suspend(struct pci_dev *pdev, pm_message_t state); | |
| 34 | 35 | |
| 35 | 36 | /* |
| 36 | 37 | * Driver module parameters. |
| @@ -3271,6 +3272,7 @@ static struct pci_driver qedf_pci_driver = { · 3234 unmodified lines | ||
| 3271 | 3272 | .probe = qedf_probe, |
| 3272 | 3273 | .remove = qedf_remove, |
| 3273 | 3274 | .shutdown = qedf_shutdown, |
| 3275 | + .suspend = qedf_suspend, | |
| 3274 | 3276 | }; |
| 3275 | 3277 | |
| 3276 | 3278 | static int __qedf_probe(struct pci_dev *pdev, int mode) |
| @@ -4000,6 +4002,22 @@ static void qedf_shutdown(struct pci_dev *pdev) · 723 unmodified lines | ||
| 4000 | 4002 | __qedf_remove(pdev, QEDF_MODE_NORMAL); |
| 4001 | 4003 | } |
| 4002 | 4004 | |
| 4005 | +static int qedf_suspend(struct pci_dev *pdev, pm_message_t state) | |
| 4006 | +{ | |
| 4007 | + struct qedf_ctx *qedf; | |
| 4008 | + | |
| 4009 | + if (!pdev) { | |
| 4010 | + QEDF_ERR(NULL, "pdev is NULL.\n"); | |
| 4011 | + return -ENODEV; | |
| 4012 | + } | |
| 4013 | + | |
| 4014 | + qedf = pci_get_drvdata(pdev); | |
| 4015 | + | |
| 4016 | + QEDF_ERR(&qedf->dbg_ctx, "%s: Device does not support suspend operation\n", __func__); | |
| 4017 | + | |
| 4018 | + return -EPERM; | |
| 4019 | +} | |
| 4020 | + | |
| 4003 | 4021 | /* |
| 4004 | 4022 | * Recovery handler code |
| 4005 | 4023 | */ |
| @@ -69,6 +69,7 @@ static struct nvm_iscsi_block *qedi_get_nvram_block(struct qedi_ctx *qedi); · 68 unmodified lines | ||
| 69 | 69 | static void qedi_recovery_handler(struct work_struct *work); |
| 70 | 70 | static void qedi_schedule_hw_err_handler(void *dev, |
| 71 | 71 | enum qed_hw_err_type err_type); |
| 72 | +static int qedi_suspend(struct pci_dev *pdev, pm_message_t state); | |
| 72 | 73 | |
| 73 | 74 | static int qedi_iscsi_event_cb(void *context, u8 fw_event_code, void *fw_handle) |
| 74 | 75 | { |
| @@ -1976,8 +1977,9 @@ static int qedi_cpu_offline(unsigned int cpu) · 1901 unmodified lines | ||
| 1976 | 1977 | struct qedi_percpu_s *p = this_cpu_ptr(&qedi_percpu); |
| 1977 | 1978 | struct qedi_work *work, *tmp; |
| 1978 | 1979 | struct task_struct *thread; |
| 1980 | + unsigned long flags; | |
| 1979 | 1981 | |
| 1980 | − spin_lock_bh(&p->p_work_lock); | |
| 1982 | + spin_lock_irqsave(&p->p_work_lock, flags); | |
| 1981 | 1983 | thread = p->iothread; |
| 1982 | 1984 | p->iothread = NULL; |
| 1983 | 1985 | |
| @@ -1988,7 +1990,7 @@ static int qedi_cpu_offline(unsigned int cpu) · 4 unmodified lines | ||
| 1988 | 1990 | kfree(work); |
| 1989 | 1991 | } |
| 1990 | 1992 | |
| 1991 | − spin_unlock_bh(&p->p_work_lock); | |
| 1993 | + spin_unlock_irqrestore(&p->p_work_lock, flags); | |
| 1992 | 1994 | if (thread) |
| 1993 | 1995 | kthread_stop(thread); |
| 1994 | 1996 | return 0; |
| @@ -2510,6 +2512,22 @@ static void qedi_shutdown(struct pci_dev *pdev) · 515 unmodified lines | ||
| 2510 | 2512 | __qedi_remove(pdev, QEDI_MODE_SHUTDOWN); |
| 2511 | 2513 | } |
| 2512 | 2514 | |
| 2515 | +static int qedi_suspend(struct pci_dev *pdev, pm_message_t state) | |
| 2516 | +{ | |
| 2517 | + struct qedi_ctx *qedi; | |
| 2518 | + | |
| 2519 | + if (!pdev) { | |
| 2520 | + QEDI_ERR(NULL, "pdev is NULL.\n"); | |
| 2521 | + return -ENODEV; | |
| 2522 | + } | |
| 2523 | + | |
| 2524 | + qedi = pci_get_drvdata(pdev); | |
| 2525 | + | |
| 2526 | + QEDI_ERR(&qedi->dbg_ctx, "%s: Device does not support suspend operation\n", __func__); | |
| 2527 | + | |
| 2528 | + return -EPERM; | |
| 2529 | +} | |
| 2530 | + | |
| 2513 | 2531 | static int __qedi_probe(struct pci_dev *pdev, int mode) |
| 2514 | 2532 | { |
| 2515 | 2533 | struct qedi_ctx *qedi; |
| @@ -2868,6 +2886,7 @@ static struct pci_driver qedi_pci_driver = { · 352 unmodified lines | ||
| 2868 | 2886 | .remove = qedi_remove, |
| 2869 | 2887 | .shutdown = qedi_shutdown, |
| 2870 | 2888 | .err_handler = &qedi_err_handler, |
| 2889 | + .suspend = qedi_suspend, | |
| 2871 | 2890 | }; |
| 2872 | 2891 | |
| 2873 | 2892 | static int __init qedi_init(void) |
| @@ -4502,7 +4502,6 @@ struct qla_hw_data { · 4501 unmodified lines | ||
| 4502 | 4502 | |
| 4503 | 4503 | /* n2n */ |
| 4504 | 4504 | struct fc_els_flogi plogi_els_payld; |
| 4505 | −#define LOGIN_TEMPLATE_SIZE (sizeof(struct fc_els_flogi) - 4) | |
| 4506 | 4505 | |
| 4507 | 4506 | void *swl; |
| 4508 | 4507 | |
| @@ -8499,7 +8499,7 @@ qla24xx_load_risc_flash(scsi_qla_host_t *vha, uint32_t *srisc_addr, · 8498 unmodified lines | ||
| 8499 | 8499 | ql_dbg(ql_dbg_init, vha, 0x0163, |
| 8500 | 8500 | "-> fwdt%u template allocate template %#x words...\n", |
| 8501 | 8501 | j, risc_size); |
| 8502 | − fwdt->template = vmalloc(risc_size * sizeof(*dcode)); | |
| 8502 | + fwdt->template = vmalloc_array(risc_size, sizeof(*dcode)); | |
| 8503 | 8503 | if (!fwdt->template) { |
| 8504 | 8504 | ql_log(ql_log_warn, vha, 0x0164, |
| 8505 | 8505 | "-> fwdt%u failed allocate template.\n", j); |
| @@ -8754,7 +8754,7 @@ qla24xx_load_risc_blob(scsi_qla_host_t *vha, uint32_t *srisc_addr) · 248 unmodified lines | ||
| 8754 | 8754 | ql_dbg(ql_dbg_init, vha, 0x0173, |
| 8755 | 8755 | "-> fwdt%u template allocate template %#x words...\n", |
| 8756 | 8756 | j, risc_size); |
| 8757 | − fwdt->template = vmalloc(risc_size * sizeof(*dcode)); | |
| 8757 | + fwdt->template = vmalloc_array(risc_size, sizeof(*dcode)); | |
| 8758 | 8758 | if (!fwdt->template) { |
| 8759 | 8759 | ql_log(ql_log_warn, vha, 0x0174, |
| 8760 | 8760 | "-> fwdt%u failed allocate template.\n", j); |
| @@ -3072,7 +3072,8 @@ qla24xx_els_dcmd2_iocb(scsi_qla_host_t *vha, int els_opcode, · 3071 unmodified lines | ||
| 3072 | 3072 | memset(ptr, 0, sizeof(struct els_plogi_payload)); |
| 3073 | 3073 | memset(resp_ptr, 0, sizeof(struct els_plogi_payload)); |
| 3074 | 3074 | memcpy(elsio->u.els_plogi.els_plogi_pyld->data, |
| 3075 | − &ha->plogi_els_payld.fl_csp, LOGIN_TEMPLATE_SIZE); | |
| 3075 | + (void *)&ha->plogi_els_payld + offsetof(struct fc_els_flogi, fl_csp), | |
| 3076 | + sizeof(ha->plogi_els_payld) - offsetof(struct fc_els_flogi, fl_csp)); | |
| 3076 | 3077 | |
| 3077 | 3078 | elsio->u.els_plogi.els_cmd = els_opcode; |
| 3078 | 3079 | elsio->u.els_plogi.els_plogi_pyld->opcode = els_opcode; |
| @@ -3919,7 +3920,7 @@ qla2x00_start_sp(srb_t *sp) · 840 unmodified lines | ||
| 3919 | 3920 | |
| 3920 | 3921 | pkt = __qla2x00_alloc_iocbs(sp->qpair, sp); |
| 3921 | 3922 | if (!pkt) { |
| 3922 | − rval = EAGAIN; | |
| 3923 | + rval = -EAGAIN; | |
| 3923 | 3924 | ql_log(ql_log_warn, vha, 0x700c, |
| 3924 | 3925 | "qla2x00_alloc_iocbs failed.\n"); |
| 3925 | 3926 | goto done; |
| @@ -209,53 +209,6 @@ raid_attr_ro_state(level); · 208 unmodified lines | ||
| 209 | 209 | raid_attr_ro_fn(resync); |
| 210 | 210 | raid_attr_ro_state_fn(state); |
| 211 | 211 | |
| 212 | −static void raid_component_release(struct device *dev) | |
| 213 | −{ | |
| 214 | − struct raid_component *rc = | |
| 215 | − container_of(dev, struct raid_component, dev); | |
| 216 | − dev_printk(KERN_ERR, rc->dev.parent, "COMPONENT RELEASE\n"); | |
| 217 | − put_device(rc->dev.parent); | |
| 218 | − kfree(rc); | |
| 219 | −} | |
| 220 | − | |
| 221 | −int raid_component_add(struct raid_template *r,struct device *raid_dev, | |
| 222 | − struct device *component_dev) | |
| 223 | −{ | |
| 224 | − struct device *cdev = | |
| 225 | − attribute_container_find_class_device(&r->raid_attrs.ac, | |
| 226 | − raid_dev); | |
| 227 | − struct raid_component *rc; | |
| 228 | − struct raid_data *rd = dev_get_drvdata(cdev); | |
| 229 | − int err; | |
| 230 | − | |
| 231 | − rc = kzalloc(sizeof(*rc), GFP_KERNEL); | |
| 232 | − if (!rc) | |
| 233 | − return -ENOMEM; | |
| 234 | − | |
| 235 | − INIT_LIST_HEAD(&rc->node); | |
| 236 | − device_initialize(&rc->dev); | |
| 237 | − rc->dev.release = raid_component_release; | |
| 238 | − rc->dev.parent = get_device(component_dev); | |
| 239 | − rc->num = rd->component_count++; | |
| 240 | − | |
| 241 | − dev_set_name(&rc->dev, "component-%d", rc->num); | |
| 242 | − list_add_tail(&rc->node, &rd->component_list); | |
| 243 | − rc->dev.class = &raid_class.class; | |
| 244 | − err = device_add(&rc->dev); | |
| 245 | − if (err) | |
| 246 | − goto err_out; | |
| 247 | − | |
| 248 | − return 0; | |
| 249 | − | |
| 250 | −err_out: | |
| 251 | − list_del(&rc->node); | |
| 252 | − rd->component_count--; | |
| 253 | − put_device(component_dev); | |
| 254 | − kfree(rc); | |
| 255 | − return err; | |
| 256 | −} | |
| 257 | −EXPORT_SYMBOL(raid_component_add); | |
| 258 | − | |
| 259 | 212 | struct raid_template * |
| 260 | 213 | raid_class_attach(struct raid_function_template *ft) |
| 261 | 214 | { |
| @@ -841,11 +841,6 @@ static int sdeb_zbc_nr_conv = DEF_ZBC_NR_CONV_ZONES; · 840 unmodified lines | ||
| 841 | 841 | static int submit_queues = DEF_SUBMIT_QUEUES; /* > 1 for multi-queue (mq) */ |
| 842 | 842 | static int poll_queues; /* iouring iopoll interface.*/ |
| 843 | 843 | |
| 844 | −static DEFINE_RWLOCK(atomic_rw); | |
| 845 | −static DEFINE_RWLOCK(atomic_rw2); | |
| 846 | − | |
| 847 | −static rwlock_t *ramdisk_lck_a[2]; | |
| 848 | − | |
| 849 | 844 | static char sdebug_proc_name[] = MY_NAME; |
| 850 | 845 | static const char *my_name = MY_NAME; |
| 851 | 846 | |
| @@ -6818,9 +6813,6 @@ static int __init scsi_debug_init(void) · 5966 unmodified lines | ||
| 6818 | 6813 | int k, ret, hosts_to_add; |
| 6819 | 6814 | int idx = -1; |
| 6820 | 6815 | |
| 6821 | − ramdisk_lck_a[0] = &atomic_rw; | |
| 6822 | − ramdisk_lck_a[1] = &atomic_rw2; | |
| 6823 | − | |
| 6824 | 6816 | if (sdebug_ndelay >= 1000 * 1000 * 1000) { |
| 6825 | 6817 | pr_warn("ndelay must be less than 1 second, ignored\n"); |
| 6826 | 6818 | sdebug_ndelay = 0; |
| @@ -406,7 +406,7 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf, · 405 unmodified lines | ||
| 406 | 406 | size_t length, loff_t *ppos) |
| 407 | 407 | { |
| 408 | 408 | int host, channel, id, lun; |
| 409 | − char *buffer, *p; | |
| 409 | + char *buffer, *end, *p; | |
| 410 | 410 | int err; |
| 411 | 411 | |
| 412 | 412 | if (!buf || length > PAGE_SIZE) |
| @@ -421,10 +421,14 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf, · 8 unmodified lines | ||
| 421 | 421 | goto out; |
| 422 | 422 | |
| 423 | 423 | err = -EINVAL; |
| 424 | − if (length < PAGE_SIZE) | |
| 425 | − buffer[length] = '\0'; | |
| 426 | − else if (buffer[PAGE_SIZE-1]) | |
| 427 | − goto out; | |
| 424 | + if (length < PAGE_SIZE) { | |
| 425 | + end = buffer + length; | |
| 426 | + *end = '\0'; | |
| 427 | + } else { | |
| 428 | + end = buffer + PAGE_SIZE - 1; | |
| 429 | + if (*end) | |
| 430 | + goto out; | |
| 431 | + } | |
| 428 | 432 | |
| 429 | 433 | /* |
| 430 | 434 | * Usage: echo "scsi add-single-device 0 1 2 3" >/proc/scsi/scsi |
| @@ -433,10 +437,10 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf, · 2 unmodified lines | ||
| 433 | 437 | if (!strncmp("scsi add-single-device", buffer, 22)) { |
| 434 | 438 | p = buffer + 23; |
| 435 | 439 | |
| 436 | − host = simple_strtoul(p, &p, 0); | |
| 437 | − channel = simple_strtoul(p + 1, &p, 0); | |
| 438 | − id = simple_strtoul(p + 1, &p, 0); | |
| 439 | − lun = simple_strtoul(p + 1, &p, 0); | |
| 440 | + host = (p < end) ? simple_strtoul(p, &p, 0) : 0; | |
| 441 | + channel = (p + 1 < end) ? simple_strtoul(p + 1, &p, 0) : 0; | |
| 442 | + id = (p + 1 < end) ? simple_strtoul(p + 1, &p, 0) : 0; | |
| 443 | + lun = (p + 1 < end) ? simple_strtoul(p + 1, &p, 0) : 0; | |
| 440 | 444 | |
| 441 | 445 | err = scsi_add_single_device(host, channel, id, lun); |
| 442 | 446 | |
| @@ -447,10 +451,10 @@ static ssize_t proc_scsi_write(struct file *file, const char __user *buf, · 4 unmodified lines | ||
| 447 | 451 | } else if (!strncmp("scsi remove-single-device", buffer, 25)) { |
| 448 | 452 | p = buffer + 26; |
| 449 | 453 | |
| 450 | − host = simple_strtoul(p, &p, 0); | |
| 451 | − channel = simple_strtoul(p + 1, &p, 0); | |
| 452 | − id = simple_strtoul(p + 1, &p, 0); | |
| 453 | − lun = simple_strtoul(p + 1, &p, 0); | |
| 454 | + host = (p < end) ? simple_strtoul(p, &p, 0) : 0; | |
| 455 | + channel = (p + 1 < end) ? simple_strtoul(p + 1, &p, 0) : 0; | |
| 456 | + id = (p + 1 < end) ? simple_strtoul(p + 1, &p, 0) : 0; | |
| 457 | + lun = (p + 1 < end) ? simple_strtoul(p + 1, &p, 0) : 0; | |
| 454 | 458 | |
| 455 | 459 | err = scsi_remove_single_device(host, channel, id, lun); |
| 456 | 460 | } |
| @@ -831,7 +831,6 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp) · 830 unmodified lines | ||
| 831 | 831 | struct request_queue *q = disk->queue; |
| 832 | 832 | u32 zone_blocks = sdkp->early_zone_info.zone_blocks; |
| 833 | 833 | unsigned int nr_zones = sdkp->early_zone_info.nr_zones; |
| 834 | − u32 max_append; | |
| 835 | 834 | int ret = 0; |
| 836 | 835 | unsigned int flags; |
| 837 | 836 | |
| @@ -876,6 +875,11 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp) · 38 unmodified lines | ||
| 876 | 875 | goto unlock; |
| 877 | 876 | } |
| 878 | 877 | |
| 878 | + blk_queue_chunk_sectors(q, | |
| 879 | + logical_to_sectors(sdkp->device, zone_blocks)); | |
| 880 | + blk_queue_max_zone_append_sectors(q, | |
| 881 | + q->limits.max_segments << PAGE_SECTORS_SHIFT); | |
| 882 | + | |
| 879 | 883 | ret = blk_revalidate_disk_zones(disk, sd_zbc_revalidate_zones_cb); |
| 880 | 884 | |
| 881 | 885 | memalloc_noio_restore(flags); |
| @@ -888,12 +892,6 @@ int sd_zbc_revalidate_zones(struct scsi_disk *sdkp) · 6 unmodified lines | ||
| 888 | 892 | goto unlock; |
| 889 | 893 | } |
| 890 | 894 | |
| 891 | − max_append = min_t(u32, logical_to_sectors(sdkp->device, zone_blocks), | |
| 892 | − q->limits.max_segments << PAGE_SECTORS_SHIFT); | |
| 893 | − max_append = min_t(u32, max_append, queue_max_hw_sectors(q)); | |
| 894 | − | |
| 895 | − blk_queue_max_zone_append_sectors(q, max_append); | |
| 896 | − | |
| 897 | 895 | sd_zbc_print_zones(sdkp); |
| 898 | 896 | |
| 899 | 897 | unlock: |
| @@ -1497,9 +1497,10 @@ sg_add_device(struct device *cl_dev) · 1496 unmodified lines | ||
| 1497 | 1497 | int error; |
| 1498 | 1498 | unsigned long iflags; |
| 1499 | 1499 | |
| 1500 | − error = blk_get_queue(scsidp->request_queue); | |
| 1501 | − if (error) | |
| 1502 | − return error; | |
| 1500 | + if (!blk_get_queue(scsidp->request_queue)) { | |
| 1501 | + pr_warn("%s: get scsi_device queue failed\n", __func__); | |
| 1502 | + return -ENODEV; | |
| 1503 | + } | |
| 1503 | 1504 | |
| 1504 | 1505 | error = -ENOMEM; |
| 1505 | 1506 | cdev = cdev_alloc(); |
| @@ -307,7 +307,7 @@ snic_tgt_create(struct snic *snic, struct snic_tgt_id *tgtid) · 306 unmodified lines | ||
| 307 | 307 | spin_lock_irqsave(snic->shost->host_lock, flags); |
| 308 | 308 | list_del(&tgt->list); |
| 309 | 309 | spin_unlock_irqrestore(snic->shost->host_lock, flags); |
| 310 | − kfree(tgt); | |
| 310 | + put_device(&tgt->dev); | |
| 311 | 311 | tgt = NULL; |
| 312 | 312 | |
| 313 | 313 | return tgt; |
| @@ -316,8 +316,12 @@ enum storvsc_request_type { · 315 unmodified lines | ||
| 316 | 316 | #define SRB_STATUS_ABORTED 0x02 |
| 317 | 317 | #define SRB_STATUS_ERROR 0x04 |
| 318 | 318 | #define SRB_STATUS_INVALID_REQUEST 0x06 |
| 319 | +#define SRB_STATUS_TIMEOUT 0x09 | |
| 320 | +#define SRB_STATUS_SELECTION_TIMEOUT 0x0A | |
| 321 | +#define SRB_STATUS_BUS_RESET 0x0E | |
| 319 | 322 | #define SRB_STATUS_DATA_OVERRUN 0x12 |
| 320 | 323 | #define SRB_STATUS_INVALID_LUN 0x20 |
| 324 | +#define SRB_STATUS_INTERNAL_ERROR 0x30 | |
| 321 | 325 | |
| 322 | 326 | #define SRB_STATUS(status) \ |
| 323 | 327 | (status & ~(SRB_STATUS_AUTOSENSE_VALID | SRB_STATUS_QUEUE_FROZEN)) |
| @@ -365,6 +369,7 @@ static void storvsc_on_channel_callback(void *context); · 41 unmodified lines | ||
| 365 | 369 | #define STORVSC_FC_MAX_LUNS_PER_TARGET 255 |
| 366 | 370 | #define STORVSC_FC_MAX_TARGETS 128 |
| 367 | 371 | #define STORVSC_FC_MAX_CHANNELS 8 |
| 372 | +#define STORVSC_FC_MAX_XFER_SIZE ((u32)(512 * 1024)) | |
| 368 | 373 | |
| 369 | 374 | #define STORVSC_IDE_MAX_LUNS_PER_TARGET 64 |
| 370 | 375 | #define STORVSC_IDE_MAX_TARGETS 1 |
| @@ -978,6 +983,11 @@ static void storvsc_handle_error(struct vmscsi_request *vm_srb, · 607 unmodified lines | ||
| 978 | 983 | case SRB_STATUS_ERROR: |
| 979 | 984 | case SRB_STATUS_ABORTED: |
| 980 | 985 | case SRB_STATUS_INVALID_REQUEST: |
| 986 | + case SRB_STATUS_INTERNAL_ERROR: | |
| 987 | + case SRB_STATUS_TIMEOUT: | |
| 988 | + case SRB_STATUS_SELECTION_TIMEOUT: | |
| 989 | + case SRB_STATUS_BUS_RESET: | |
| 990 | + case SRB_STATUS_DATA_OVERRUN: | |
| 981 | 991 | if (vm_srb->srb_status & SRB_STATUS_AUTOSENSE_VALID) { |
| 982 | 992 | /* Check for capacity change */ |
| 983 | 993 | if ((asc == 0x2a) && (ascq == 0x9)) { |
| @@ -1671,10 +1681,6 @@ static int storvsc_host_reset_handler(struct scsi_cmnd *scmnd) · 687 unmodified lines | ||
| 1671 | 1681 | */ |
| 1672 | 1682 | static enum scsi_timeout_action storvsc_eh_timed_out(struct scsi_cmnd *scmnd) |
| 1673 | 1683 | { |
| 1674 | −#if IS_ENABLED(CONFIG_SCSI_FC_ATTRS) | |
| 1675 | − if (scmnd->device->host->transportt == fc_transport_template) | |
| 1676 | − return fc_eh_timed_out(scmnd); | |
| 1677 | −#endif | |
| 1678 | 1684 | return SCSI_EH_RESET_TIMER; |
| 1679 | 1685 | } |
| 1680 | 1686 | |
| @@ -2004,6 +2010,9 @@ static int storvsc_probe(struct hv_device *device, · 323 unmodified lines | ||
| 2004 | 2010 | * protecting it from any weird value. |
| 2005 | 2011 | */ |
| 2006 | 2012 | max_xfer_bytes = round_down(stor_device->max_transfer_bytes, HV_HYP_PAGE_SIZE); |
| 2013 | + if (is_fc) | |
| 2014 | + max_xfer_bytes = min(max_xfer_bytes, STORVSC_FC_MAX_XFER_SIZE); | |
| 2015 | + | |
| 2007 | 2016 | /* max_hw_sectors_kb */ |
| 2008 | 2017 | host->max_sectors = max_xfer_bytes >> 9; |
| 2009 | 2018 | /* |
| @@ -578,7 +578,6 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba, · 577 unmodified lines | ||
| 578 | 578 | { |
| 579 | 579 | struct ufshcd_lrb *lrbp = &hba->lrb[task_tag]; |
| 580 | 580 | struct utp_transfer_req_desc *utrd; |
| 581 | − u32 mask = hwq->max_entries - 1; | |
| 582 | 581 | __le64 cmd_desc_base_addr; |
| 583 | 582 | bool ret = false; |
| 584 | 583 | u64 addr, match; |
| @@ -606,7 +605,10 @@ static bool ufshcd_mcq_sqe_search(struct ufs_hba *hba, · 21 unmodified lines | ||
| 606 | 605 | ret = true; |
| 607 | 606 | goto out; |
| 608 | 607 | } |
| 609 | − sq_head_slot = (sq_head_slot + 1) & mask; | |
| 608 | + | |
| 609 | + sq_head_slot++; | |
| 610 | + if (sq_head_slot == hwq->max_entries) | |
| 611 | + sq_head_slot = 0; | |
| 610 | 612 | } |
| 611 | 613 | |
| 612 | 614 | out: |
| @@ -8452,6 +8452,41 @@ out: · 8451 unmodified lines | ||
| 8452 | 8452 | return ret; |
| 8453 | 8453 | } |
| 8454 | 8454 | |
| 8455 | +static void ufshcd_set_timestamp_attr(struct ufs_hba *hba) | |
| 8456 | +{ | |
| 8457 | + int err; | |
| 8458 | + struct ufs_query_req *request = NULL; | |
| 8459 | + struct ufs_query_res *response = NULL; | |
| 8460 | + struct ufs_dev_info *dev_info = &hba->dev_info; | |
| 8461 | + struct utp_upiu_query_v4_0 *upiu_data; | |
| 8462 | + | |
| 8463 | + if (dev_info->wspecversion < 0x400) | |
| 8464 | + return; | |
| 8465 | + | |
| 8466 | + ufshcd_hold(hba); | |
| 8467 | + | |
| 8468 | + mutex_lock(&hba->dev_cmd.lock); | |
| 8469 | + | |
| 8470 | + ufshcd_init_query(hba, &request, &response, | |
| 8471 | + UPIU_QUERY_OPCODE_WRITE_ATTR, | |
| 8472 | + QUERY_ATTR_IDN_TIMESTAMP, 0, 0); | |
| 8473 | + | |
| 8474 | + request->query_func = UPIU_QUERY_FUNC_STANDARD_WRITE_REQUEST; | |
| 8475 | + | |
| 8476 | + upiu_data = (struct utp_upiu_query_v4_0 *)&request->upiu_req; | |
| 8477 | + | |
| 8478 | + put_unaligned_be64(ktime_get_real_ns(), &upiu_data->osf3); | |
| 8479 | + | |
| 8480 | + err = ufshcd_exec_dev_cmd(hba, DEV_CMD_TYPE_QUERY, QUERY_REQ_TIMEOUT); | |
| 8481 | + | |
| 8482 | + if (err) | |
| 8483 | + dev_err(hba->dev, "%s: failed to set timestamp %d\n", | |
| 8484 | + __func__, err); | |
| 8485 | + | |
| 8486 | + mutex_unlock(&hba->dev_cmd.lock); | |
| 8487 | + ufshcd_release(hba); | |
| 8488 | +} | |
| 8489 | + | |
| 8455 | 8490 | /** |
| 8456 | 8491 | * ufshcd_add_lus - probe and add UFS logical units |
| 8457 | 8492 | * @hba: per-adapter instance |
| @@ -8641,6 +8676,8 @@ static int ufshcd_device_init(struct ufs_hba *hba, bool init_dev_params) · 183 unmodified lines | ||
| 8641 | 8676 | ufshcd_set_ufs_dev_active(hba); |
| 8642 | 8677 | ufshcd_force_reset_auto_bkops(hba); |
| 8643 | 8678 | |
| 8679 | + ufshcd_set_timestamp_attr(hba); | |
| 8680 | + | |
| 8644 | 8681 | /* Gear up to HS gear if supported */ |
| 8645 | 8682 | if (hba->max_pwr_info.is_valid) { |
| 8646 | 8683 | /* |
| @@ -9677,6 +9714,7 @@ static int __ufshcd_wl_resume(struct ufs_hba *hba, enum ufs_pm_op pm_op) · 1030 unmodified lines | ||
| 9677 | 9714 | ret = ufshcd_set_dev_pwr_mode(hba, UFS_ACTIVE_PWR_MODE); |
| 9678 | 9715 | if (ret) |
| 9679 | 9716 | goto set_old_link_state; |
| 9717 | + ufshcd_set_timestamp_attr(hba); | |
| 9680 | 9718 | } |
| 9681 | 9719 | |
| 9682 | 9720 | if (ufshcd_keep_autobkops_enabled_except_suspend(hba)) |
| @@ -72,6 +72,7 @@ config SCSI_UFS_QCOM · 71 unmodified lines | ||
| 72 | 72 | config SCSI_UFS_MEDIATEK |
| 73 | 73 | tristate "Mediatek specific hooks to UFS controller platform driver" |
| 74 | 74 | depends on SCSI_UFSHCD_PLATFORM && ARCH_MEDIATEK |
| 75 | + depends on RESET_CONTROLLER | |
| 75 | 76 | select PHY_MTK_UFS |
| 76 | 77 | select RESET_TI_SYSCON |
| 77 | 78 | help |
| @@ -365,7 +365,7 @@ static void ufs_qcom_select_unipro_mode(struct ufs_qcom_host *host) · 364 unmodified lines | ||
| 365 | 365 | ufs_qcom_cap_qunipro(host) ? QUNIPRO_SEL : 0, |
| 366 | 366 | REG_UFS_CFG1); |
| 367 | 367 | |
| 368 | − if (host->hw_ver.major == 0x05) | |
| 368 | + if (host->hw_ver.major >= 0x05) | |
| 369 | 369 | ufshcd_rmwl(host->hba, QUNIPRO_G4_SEL, 0, REG_UFS_CFG0); |
| 370 | 370 | |
| 371 | 371 | /* make sure above configuration is applied before we return */ |
| @@ -359,7 +359,7 @@ static int ufs_renesas_init(struct ufs_hba *hba) · 358 unmodified lines | ||
| 359 | 359 | { |
| 360 | 360 | struct ufs_renesas_priv *priv; |
| 361 | 361 | |
| 362 | − priv = devm_kmalloc(hba->dev, sizeof(*priv), GFP_KERNEL); | |
| 362 | + priv = devm_kzalloc(hba->dev, sizeof(*priv), GFP_KERNEL); | |
| 363 | 363 | if (!priv) |
| 364 | 364 | return -ENOMEM; |
| 365 | 365 | ufshcd_set_variant(hba, priv); |
| @@ -77,7 +77,3 @@ DEFINE_RAID_ATTRIBUTE(enum raid_state, state) · 76 unmodified lines | ||
| 77 | 77 | |
| 78 | 78 | struct raid_template *raid_class_attach(struct raid_function_template *); |
| 79 | 79 | void raid_class_release(struct raid_template *); |
| 80 | − | |
| 81 | −int __must_check raid_component_add(struct raid_template *, struct device *, | |
| 82 | − struct device *); | |
| 83 | − | |
| @@ -116,6 +116,31 @@ struct utp_upiu_query { · 115 unmodified lines | ||
| 116 | 116 | __be32 reserved[2]; |
| 117 | 117 | }; |
| 118 | 118 | |
| 119 | +/** | |
| 120 | + * struct utp_upiu_query_v4_0 - upiu request buffer structure for | |
| 121 | + * query request >= UFS 4.0 spec. | |
| 122 | + * @opcode: command to perform B-0 | |
| 123 | + * @idn: a value that indicates the particular type of data B-1 | |
| 124 | + * @index: Index to further identify data B-2 | |
| 125 | + * @selector: Index to further identify data B-3 | |
| 126 | + * @osf4: spec field B-5 | |
| 127 | + * @osf5: spec field B 6,7 | |
| 128 | + * @osf6: spec field DW 8,9 | |
| 129 | + * @osf7: spec field DW 10,11 | |
| 130 | + */ | |
| 131 | +struct utp_upiu_query_v4_0 { | |
| 132 | + __u8 opcode; | |
| 133 | + __u8 idn; | |
| 134 | + __u8 index; | |
| 135 | + __u8 selector; | |
| 136 | + __u8 osf3; | |
| 137 | + __u8 osf4; | |
| 138 | + __be16 osf5; | |
| 139 | + __be32 osf6; | |
| 140 | + __be32 osf7; | |
| 141 | + __be32 reserved; | |
| 142 | +}; | |
| 143 | + | |
| 119 | 144 | /** |
| 120 | 145 | * struct utp_upiu_cmd - Command UPIU structure |
| 121 | 146 | * @data_transfer_len: Data Transfer Length DW-3 |
| @@ -179,6 +179,7 @@ enum attr_idn { · 178 unmodified lines | ||
| 179 | 179 | QUERY_ATTR_IDN_WB_BUFF_LIFE_TIME_EST = 0x1E, |
| 180 | 180 | QUERY_ATTR_IDN_CURR_WB_BUFF_SIZE = 0x1F, |
| 181 | 181 | QUERY_ATTR_IDN_EXT_IID_EN = 0x2A, |
| 182 | + QUERY_ATTR_IDN_TIMESTAMP = 0x30 | |
| 182 | 183 | }; |
| 183 | 184 | |
| 184 | 185 | /* Descriptor idn for Query requests */ |