Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

s390/qdio: cleanly split alloc and establish

All that qdio_allocate() actually uses from the init_data is the cdev,
and the number of Input and Output Queues. Have the driver pass those as
parameters, and defer the init_data processing into qdio_establish().
This includes writing per-device(!) trace entries, and most of the
sanity checks.

Signed-off-by: Julian Wiedmann <jwi@linux.ibm.com>
Reviewed-by: Benjamin Block <bblock@linux.ibm.com>
Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>

authored by

Julian Wiedmann and committed by
Vasily Gorbik
3db1db93 143a3a73

+47 -38
+2 -1
arch/s390/include/asm/qdio.h
··· 408 408 void qdio_free_buffers(struct qdio_buffer **buf, unsigned int count); 409 409 void qdio_reset_buffers(struct qdio_buffer **buf, unsigned int count); 410 410 411 - extern int qdio_allocate(struct qdio_initialize *); 411 + extern int qdio_allocate(struct ccw_device *cdev, unsigned int no_input_qs, 412 + unsigned int no_output_qs); 412 413 extern int qdio_establish(struct qdio_initialize *); 413 414 extern int qdio_activate(struct ccw_device *); 414 415 extern void qdio_release_aob(struct qaob *);
+1 -15
drivers/s390/cio/qdio_debug.c
··· 58 58 mutex_unlock(&qdio_dbf_list_mutex); 59 59 } 60 60 61 - int qdio_allocate_dbf(struct qdio_initialize *init_data, 62 - struct qdio_irq *irq_ptr) 61 + int qdio_allocate_dbf(struct qdio_irq *irq_ptr) 63 62 { 64 63 char text[QDIO_DBF_NAME_LEN]; 65 64 struct qdio_dbf_entry *new_entry; 66 65 67 - DBF_EVENT("qfmt:%1d", init_data->q_format); 68 - DBF_HEX(init_data->adapter_name, 8); 69 - DBF_EVENT("qpff%4x", init_data->qib_param_field_format); 70 - DBF_HEX(&init_data->qib_param_field, sizeof(void *)); 71 - DBF_HEX(&init_data->input_slib_elements, sizeof(void *)); 72 - DBF_HEX(&init_data->output_slib_elements, sizeof(void *)); 73 - DBF_EVENT("niq:%1d noq:%1d", init_data->no_input_qs, 74 - init_data->no_output_qs); 75 - DBF_HEX(&init_data->input_handler, sizeof(void *)); 76 - DBF_HEX(&init_data->output_handler, sizeof(void *)); 77 - DBF_HEX(&init_data->int_parm, sizeof(long)); 78 - DBF_HEX(&init_data->input_sbal_addr_array, sizeof(void *)); 79 - DBF_HEX(&init_data->output_sbal_addr_array, sizeof(void *)); 80 66 DBF_EVENT("irq:%8lx", (unsigned long)irq_ptr); 81 67 82 68 /* allocate trace view for the interface */
+1 -2
drivers/s390/cio/qdio_debug.h
··· 64 64 debug_event(dev->debug_area, level, addr, len); 65 65 } 66 66 67 - int qdio_allocate_dbf(struct qdio_initialize *init_data, 68 - struct qdio_irq *irq_ptr); 67 + int qdio_allocate_dbf(struct qdio_irq *irq_ptr); 69 68 void qdio_setup_debug_entries(struct qdio_irq *irq_ptr); 70 69 void qdio_shutdown_debug_entries(struct qdio_irq *irq_ptr); 71 70 int qdio_debug_init(void);
+40 -16
drivers/s390/cio/qdio_main.c
··· 1220 1220 1221 1221 /** 1222 1222 * qdio_allocate - allocate qdio queues and associated data 1223 - * @init_data: initialization data 1223 + * @cdev: associated ccw device 1224 + * @no_input_qs: allocate this number of Input Queues 1225 + * @no_output_qs: allocate this number of Output Queues 1224 1226 */ 1225 - int qdio_allocate(struct qdio_initialize *init_data) 1227 + int qdio_allocate(struct ccw_device *cdev, unsigned int no_input_qs, 1228 + unsigned int no_output_qs) 1226 1229 { 1227 - struct ccw_device *cdev = init_data->cdev; 1228 1230 struct subchannel_id schid; 1229 1231 struct qdio_irq *irq_ptr; 1230 1232 1231 1233 ccw_device_get_schid(cdev, &schid); 1232 1234 DBF_EVENT("qallocate:%4x", schid.sch_no); 1233 1235 1234 - if ((init_data->no_input_qs && !init_data->input_handler) || 1235 - (init_data->no_output_qs && !init_data->output_handler)) 1236 - return -EINVAL; 1237 - 1238 - if ((init_data->no_input_qs > QDIO_MAX_QUEUES_PER_IRQ) || 1239 - (init_data->no_output_qs > QDIO_MAX_QUEUES_PER_IRQ)) 1240 - return -EINVAL; 1241 - 1242 - if ((!init_data->input_sbal_addr_array) || 1243 - (!init_data->output_sbal_addr_array)) 1236 + if (no_input_qs > QDIO_MAX_QUEUES_PER_IRQ || 1237 + no_output_qs > QDIO_MAX_QUEUES_PER_IRQ) 1244 1238 return -EINVAL; 1245 1239 1246 1240 /* irq_ptr must be in GFP_DMA since it contains ccw1.cda */ ··· 1244 1250 1245 1251 irq_ptr->cdev = cdev; 1246 1252 mutex_init(&irq_ptr->setup_mutex); 1247 - if (qdio_allocate_dbf(init_data, irq_ptr)) 1253 + if (qdio_allocate_dbf(irq_ptr)) 1248 1254 goto out_rel; 1255 + 1256 + DBF_DEV_EVENT(DBF_ERR, irq_ptr, "alloc niq:%1u noq:%1u", no_input_qs, 1257 + no_output_qs); 1249 1258 1250 1259 /* 1251 1260 * Allocate a page for the chsc calls in qdio_establish. ··· 1265 1268 if (!irq_ptr->qdr) 1266 1269 goto out_rel; 1267 1270 1268 - if (qdio_allocate_qs(irq_ptr, init_data->no_input_qs, 1269 - init_data->no_output_qs)) 1271 + if (qdio_allocate_qs(irq_ptr, no_input_qs, no_output_qs)) 1270 1272 goto out_rel; 1271 1273 1272 1274 INIT_LIST_HEAD(&irq_ptr->entry); ··· 1301 1305 DBF_EVENT("use_cq:%d", use_cq); 1302 1306 } 1303 1307 1308 + static void qdio_trace_init_data(struct qdio_irq *irq, 1309 + struct qdio_initialize *data) 1310 + { 1311 + DBF_DEV_EVENT(DBF_ERR, irq, "qfmt:%1u", data->q_format); 1312 + DBF_DEV_HEX(irq, data->adapter_name, 8, DBF_ERR); 1313 + DBF_DEV_EVENT(DBF_ERR, irq, "qpff%4x", data->qib_param_field_format); 1314 + DBF_DEV_HEX(irq, &data->qib_param_field, sizeof(void *), DBF_ERR); 1315 + DBF_DEV_HEX(irq, &data->input_slib_elements, sizeof(void *), DBF_ERR); 1316 + DBF_DEV_HEX(irq, &data->output_slib_elements, sizeof(void *), DBF_ERR); 1317 + DBF_DEV_EVENT(DBF_ERR, irq, "niq:%1u noq:%1u", data->no_input_qs, 1318 + data->no_output_qs); 1319 + DBF_DEV_HEX(irq, &data->input_handler, sizeof(void *), DBF_ERR); 1320 + DBF_DEV_HEX(irq, &data->output_handler, sizeof(void *), DBF_ERR); 1321 + DBF_DEV_HEX(irq, &data->int_parm, sizeof(long), DBF_ERR); 1322 + DBF_DEV_HEX(irq, &data->input_sbal_addr_array, sizeof(void *), DBF_ERR); 1323 + DBF_DEV_HEX(irq, &data->output_sbal_addr_array, sizeof(void *), 1324 + DBF_ERR); 1325 + } 1326 + 1304 1327 /** 1305 1328 * qdio_establish - establish queues on a qdio subchannel 1306 1329 * @init_data: initialization data ··· 1337 1322 if (!irq_ptr) 1338 1323 return -ENODEV; 1339 1324 1325 + if ((init_data->no_input_qs && !init_data->input_handler) || 1326 + (init_data->no_output_qs && !init_data->output_handler)) 1327 + return -EINVAL; 1328 + 1329 + if (!init_data->input_sbal_addr_array || 1330 + !init_data->output_sbal_addr_array) 1331 + return -EINVAL; 1332 + 1340 1333 mutex_lock(&irq_ptr->setup_mutex); 1334 + qdio_trace_init_data(irq_ptr, init_data); 1341 1335 qdio_setup_irq(irq_ptr, init_data); 1342 1336 1343 1337 rc = qdio_establish_thinint(irq_ptr);
+2 -1
drivers/s390/net/qeth_core_main.c
··· 4893 4893 4894 4894 if (atomic_cmpxchg(&card->qdio.state, QETH_QDIO_ALLOCATED, 4895 4895 QETH_QDIO_ESTABLISHED) == QETH_QDIO_ALLOCATED) { 4896 - rc = qdio_allocate(&init_data); 4896 + rc = qdio_allocate(CARD_DDEV(card), init_data.no_input_qs, 4897 + init_data.no_output_qs); 4897 4898 if (rc) { 4898 4899 atomic_set(&card->qdio.state, QETH_QDIO_ALLOCATED); 4899 4900 goto out;
+1 -3
drivers/s390/scsi/zfcp_qdio.c
··· 308 308 */ 309 309 static int zfcp_qdio_allocate(struct zfcp_qdio *qdio) 310 310 { 311 - struct qdio_initialize init_data; 312 311 int ret; 313 312 314 313 ret = qdio_alloc_buffers(qdio->req_q, QDIO_MAX_BUFFERS_PER_Q); ··· 318 319 if (ret) 319 320 goto free_req_q; 320 321 321 - zfcp_qdio_setup_init_data(&init_data, qdio); 322 322 init_waitqueue_head(&qdio->req_q_wq); 323 323 324 - ret = qdio_allocate(&init_data); 324 + ret = qdio_allocate(qdio->adapter->ccw_device, 1, 1); 325 325 if (ret) 326 326 goto free_res_q; 327 327