hc
2023-12-11 d2ccde1c8e90d38cee87a1b0309ad2827f3fd30d
kernel/drivers/s390/scsi/zfcp_qdio.c
....@@ -4,7 +4,7 @@
44 *
55 * Setup and helper functions to access QDIO.
66 *
7
- * Copyright IBM Corp. 2002, 2010
7
+ * Copyright IBM Corp. 2002, 2020
88 */
99
1010 #define KMSG_COMPONENT "zfcp"
....@@ -19,7 +19,7 @@
1919 module_param_named(datarouter, enable_multibuffer, bool, 0400);
2020 MODULE_PARM_DESC(datarouter, "Enable hardware data router support (default on)");
2121
22
-static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *id,
22
+static void zfcp_qdio_handler_error(struct zfcp_qdio *qdio, char *dbftag,
2323 unsigned int qdio_err)
2424 {
2525 struct zfcp_adapter *adapter = qdio->adapter;
....@@ -28,12 +28,12 @@
2828
2929 if (qdio_err & QDIO_ERROR_SLSB_STATE) {
3030 zfcp_qdio_siosl(adapter);
31
- zfcp_erp_adapter_shutdown(adapter, 0, id);
31
+ zfcp_erp_adapter_shutdown(adapter, 0, dbftag);
3232 return;
3333 }
3434 zfcp_erp_adapter_reopen(adapter,
3535 ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED |
36
- ZFCP_STATUS_COMMON_ERP_FAILED, id);
36
+ ZFCP_STATUS_COMMON_ERP_FAILED, dbftag);
3737 }
3838
3939 static void zfcp_qdio_zero_sbals(struct qdio_buffer *sbal[], int first, int cnt)
....@@ -98,7 +98,7 @@
9898 memset(pl, 0,
9999 ZFCP_QDIO_MAX_SBALS_PER_REQ * sizeof(void *));
100100 sbale = qdio->res_q[idx]->element;
101
- req_id = (u64) sbale->addr;
101
+ req_id = sbale->addr;
102102 scount = min(sbale->scount + 1,
103103 ZFCP_QDIO_MAX_SBALS_PER_REQ + 1);
104104 /* incl. signaling SBAL */
....@@ -180,7 +180,6 @@
180180 * @qdio: pointer to struct zfcp_qdio
181181 * @q_req: pointer to struct zfcp_qdio_req
182182 * @sg: scatter-gather list
183
- * @max_sbals: upper bound for number of SBALs to be used
184183 * Returns: zero or -EINVAL on error
185184 */
186185 int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req,
....@@ -200,7 +199,7 @@
200199 q_req->sbal_number);
201200 return -EINVAL;
202201 }
203
- sbale->addr = sg_virt(sg);
202
+ sbale->addr = sg_phys(sg);
204203 sbale->length = sg->length;
205204 }
206205 return 0;
....@@ -247,7 +246,7 @@
247246 }
248247
249248 /**
250
- * zfcp_qdio_send - set PCI flag in first SBALE and send req to QDIO
249
+ * zfcp_qdio_send - send req to QDIO
251250 * @qdio: pointer to struct zfcp_qdio
252251 * @q_req: pointer to struct zfcp_qdio_req
253252 * Returns: 0 on success, error otherwise
....@@ -261,55 +260,34 @@
261260 zfcp_qdio_account(qdio);
262261 spin_unlock(&qdio->stat_lock);
263262
263
+ atomic_sub(sbal_number, &qdio->req_q_free);
264
+
264265 retval = do_QDIO(qdio->adapter->ccw_device, QDIO_FLAG_SYNC_OUTPUT, 0,
265266 q_req->sbal_first, sbal_number);
266267
267268 if (unlikely(retval)) {
269
+ /* Failed to submit the IO, roll back our modifications. */
270
+ atomic_add(sbal_number, &qdio->req_q_free);
268271 zfcp_qdio_zero_sbals(qdio->req_q, q_req->sbal_first,
269272 sbal_number);
270273 return retval;
271274 }
272275
273276 /* account for transferred buffers */
274
- atomic_sub(sbal_number, &qdio->req_q_free);
275277 qdio->req_q_idx += sbal_number;
276278 qdio->req_q_idx %= QDIO_MAX_BUFFERS_PER_Q;
277279
278280 return 0;
279281 }
280282
281
-
282
-static void zfcp_qdio_setup_init_data(struct qdio_initialize *id,
283
- struct zfcp_qdio *qdio)
284
-{
285
- memset(id, 0, sizeof(*id));
286
- id->cdev = qdio->adapter->ccw_device;
287
- id->q_format = QDIO_ZFCP_QFMT;
288
- memcpy(id->adapter_name, dev_name(&id->cdev->dev), 8);
289
- ASCEBC(id->adapter_name, 8);
290
- id->qib_rflags = QIB_RFLAGS_ENABLE_DATA_DIV;
291
- if (enable_multibuffer)
292
- id->qdr_ac |= QDR_AC_MULTI_BUFFER_ENABLE;
293
- id->no_input_qs = 1;
294
- id->no_output_qs = 1;
295
- id->input_handler = zfcp_qdio_int_resp;
296
- id->output_handler = zfcp_qdio_int_req;
297
- id->int_parm = (unsigned long) qdio;
298
- id->input_sbal_addr_array = (void **) (qdio->res_q);
299
- id->output_sbal_addr_array = (void **) (qdio->req_q);
300
- id->scan_threshold =
301
- QDIO_MAX_BUFFERS_PER_Q - ZFCP_QDIO_MAX_SBALS_PER_REQ * 2;
302
-}
303
-
304283 /**
305284 * zfcp_qdio_allocate - allocate queue memory and initialize QDIO data
306
- * @adapter: pointer to struct zfcp_adapter
285
+ * @qdio: pointer to struct zfcp_qdio
307286 * Returns: -ENOMEM on memory allocation error or return value from
308287 * qdio_allocate
309288 */
310289 static int zfcp_qdio_allocate(struct zfcp_qdio *qdio)
311290 {
312
- struct qdio_initialize init_data;
313291 int ret;
314292
315293 ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q);
....@@ -320,10 +298,9 @@
320298 if (ret)
321299 goto free_req_q;
322300
323
- zfcp_qdio_setup_init_data(&init_data, qdio);
324301 init_waitqueue_head(&qdio->req_q_wq);
325302
326
- ret = qdio_allocate(&init_data);
303
+ ret = qdio_allocate(qdio->adapter->ccw_device, 1, 1);
327304 if (ret)
328305 goto free_res_q;
329306
....@@ -368,6 +345,18 @@
368345 atomic_set(&qdio->req_q_free, 0);
369346 }
370347
348
+void zfcp_qdio_shost_update(struct zfcp_adapter *const adapter,
349
+ const struct zfcp_qdio *const qdio)
350
+{
351
+ struct Scsi_Host *const shost = adapter->scsi_host;
352
+
353
+ if (shost == NULL)
354
+ return;
355
+
356
+ shost->sg_tablesize = qdio->max_sbale_per_req;
357
+ shost->max_sectors = qdio->max_sbale_per_req * 8;
358
+}
359
+
371360 /**
372361 * zfcp_qdio_open - prepare and initialize response queue
373362 * @qdio: pointer to struct zfcp_qdio
....@@ -375,8 +364,10 @@
375364 */
376365 int zfcp_qdio_open(struct zfcp_qdio *qdio)
377366 {
367
+ struct qdio_buffer **input_sbals[1] = {qdio->res_q};
368
+ struct qdio_buffer **output_sbals[1] = {qdio->req_q};
378369 struct qdio_buffer_element *sbale;
379
- struct qdio_initialize init_data;
370
+ struct qdio_initialize init_data = {0};
380371 struct zfcp_adapter *adapter = qdio->adapter;
381372 struct ccw_device *cdev = adapter->ccw_device;
382373 struct qdio_ssqd_desc ssqd;
....@@ -388,12 +379,24 @@
388379 atomic_andnot(ZFCP_STATUS_ADAPTER_SIOSL_ISSUED,
389380 &qdio->adapter->status);
390381
391
- zfcp_qdio_setup_init_data(&init_data, qdio);
382
+ init_data.q_format = QDIO_ZFCP_QFMT;
383
+ init_data.qib_rflags = QIB_RFLAGS_ENABLE_DATA_DIV;
384
+ if (enable_multibuffer)
385
+ init_data.qdr_ac |= QDR_AC_MULTI_BUFFER_ENABLE;
386
+ init_data.no_input_qs = 1;
387
+ init_data.no_output_qs = 1;
388
+ init_data.input_handler = zfcp_qdio_int_resp;
389
+ init_data.output_handler = zfcp_qdio_int_req;
390
+ init_data.int_parm = (unsigned long) qdio;
391
+ init_data.input_sbal_addr_array = input_sbals;
392
+ init_data.output_sbal_addr_array = output_sbals;
393
+ init_data.scan_threshold =
394
+ QDIO_MAX_BUFFERS_PER_Q - ZFCP_QDIO_MAX_SBALS_PER_REQ * 2;
392395
393
- if (qdio_establish(&init_data))
396
+ if (qdio_establish(cdev, &init_data))
394397 goto failed_establish;
395398
396
- if (qdio_get_ssqd_desc(init_data.cdev, &ssqd))
399
+ if (qdio_get_ssqd_desc(cdev, &ssqd))
397400 goto failed_qdio;
398401
399402 if (ssqd.qdioac2 & CHSC_AC2_DATA_DIV_ENABLED)
....@@ -419,7 +422,7 @@
419422 sbale->length = 0;
420423 sbale->eflags = SBAL_EFLAGS_LAST_ENTRY;
421424 sbale->sflags = 0;
422
- sbale->addr = NULL;
425
+ sbale->addr = 0;
423426 }
424427
425428 if (do_QDIO(cdev, QDIO_FLAG_SYNC_INPUT, 0, 0, QDIO_MAX_BUFFERS_PER_Q))
....@@ -430,10 +433,7 @@
430433 atomic_set(&qdio->req_q_free, QDIO_MAX_BUFFERS_PER_Q);
431434 atomic_or(ZFCP_STATUS_ADAPTER_QDIOUP, &qdio->adapter->status);
432435
433
- if (adapter->scsi_host) {
434
- adapter->scsi_host->sg_tablesize = qdio->max_sbale_per_req;
435
- adapter->scsi_host->max_sectors = qdio->max_sbale_per_req * 8;
436
- }
436
+ zfcp_qdio_shost_update(adapter, qdio);
437437
438438 return 0;
439439