1249 spin_lock_bh(&adapter->req_q_lock);
1250 if (zfcp_fsf_req_sbal_get(adapter))
1251 goto out;
1252
1253 req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA,
1254 0, NULL);
1255 if (IS_ERR(req)) {
1256 retval = PTR_ERR(req);
1257 goto out;
1258 }
1259
1260 sbale = zfcp_qdio_sbale_req(req);
1261 sbale[0].flags |= SBAL_FLAGS0_TYPE_READ;
1262 sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY;
1263 req->handler = zfcp_fsf_exchange_config_data_handler;
1264
1265 req->qtcb->bottom.config.feature_selection =
1266 FSF_FEATURE_CFDC |
1267 FSF_FEATURE_LUN_SHARING |
1268 FSF_FEATURE_NOTIFICATION_LOST |
1269 FSF_FEATURE_UPDATE_ALERT;
1270
1271 if (data)
1272 req->data = data;
1273
1274 zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
1275 retval = zfcp_fsf_req_send(req);
1276out:
1277 spin_unlock_bh(&adapter->req_q_lock);
1278 if (!retval)
1279 wait_event(req->completion_wq,
1280 req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
1281
1282 zfcp_fsf_req_free(req);
1283
1284 return retval;
1285}
1286
1287
1288
1289