diff options
| author | Ingo Molnar <mingo@elte.hu> | 2008-10-10 13:30:08 -0400 |
|---|---|---|
| committer | Ingo Molnar <mingo@elte.hu> | 2008-10-10 13:30:08 -0400 |
| commit | 3dd392a407d15250a501fa109cc1f93fee95ef85 (patch) | |
| tree | c1faca3fa8bd0f7c8790b3e0887229b4a5a90e8b /drivers/s390/scsi/zfcp_fc.c | |
| parent | b27a43c1e90582facad44de67d02bc9e9f900289 (diff) | |
| parent | d403a6484f0341bf0624d17ece46f24f741b6a92 (diff) | |
Merge branch 'linus' into x86/pat2
Conflicts:
arch/x86/mm/init_64.c
Diffstat (limited to 'drivers/s390/scsi/zfcp_fc.c')
| -rw-r--r-- | drivers/s390/scsi/zfcp_fc.c | 33 |
1 files changed, 12 insertions, 21 deletions
diff --git a/drivers/s390/scsi/zfcp_fc.c b/drivers/s390/scsi/zfcp_fc.c index e984469bb98b..56196c98c07b 100644 --- a/drivers/s390/scsi/zfcp_fc.c +++ b/drivers/s390/scsi/zfcp_fc.c | |||
| @@ -39,18 +39,6 @@ struct zfcp_gpn_ft { | |||
| 39 | struct scatterlist sg_resp[ZFCP_GPN_FT_BUFFERS]; | 39 | struct scatterlist sg_resp[ZFCP_GPN_FT_BUFFERS]; |
| 40 | }; | 40 | }; |
| 41 | 41 | ||
| 42 | static struct zfcp_port *zfcp_get_port_by_did(struct zfcp_adapter *adapter, | ||
| 43 | u32 d_id) | ||
| 44 | { | ||
| 45 | struct zfcp_port *port; | ||
| 46 | |||
| 47 | list_for_each_entry(port, &adapter->port_list_head, list) | ||
| 48 | if ((port->d_id == d_id) && | ||
| 49 | !atomic_test_mask(ZFCP_STATUS_COMMON_REMOVE, &port->status)) | ||
| 50 | return port; | ||
| 51 | return NULL; | ||
| 52 | } | ||
| 53 | |||
| 54 | static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range, | 42 | static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range, |
| 55 | struct fcp_rscn_element *elem) | 43 | struct fcp_rscn_element *elem) |
| 56 | { | 44 | { |
| @@ -341,12 +329,13 @@ void zfcp_test_link(struct zfcp_port *port) | |||
| 341 | 329 | ||
| 342 | zfcp_port_get(port); | 330 | zfcp_port_get(port); |
| 343 | retval = zfcp_fc_adisc(port); | 331 | retval = zfcp_fc_adisc(port); |
| 344 | if (retval == 0 || retval == -EBUSY) | 332 | if (retval == 0) |
| 345 | return; | 333 | return; |
| 346 | 334 | ||
| 347 | /* send of ADISC was not possible */ | 335 | /* send of ADISC was not possible */ |
| 348 | zfcp_port_put(port); | 336 | zfcp_port_put(port); |
| 349 | zfcp_erp_port_forced_reopen(port, 0, 65, NULL); | 337 | if (retval != -EBUSY) |
| 338 | zfcp_erp_port_forced_reopen(port, 0, 65, NULL); | ||
| 350 | } | 339 | } |
| 351 | 340 | ||
| 352 | static int zfcp_scan_get_nameserver(struct zfcp_adapter *adapter) | 341 | static int zfcp_scan_get_nameserver(struct zfcp_adapter *adapter) |
| @@ -363,7 +352,6 @@ static int zfcp_scan_get_nameserver(struct zfcp_adapter *adapter) | |||
| 363 | if (ret) | 352 | if (ret) |
| 364 | return ret; | 353 | return ret; |
| 365 | zfcp_erp_wait(adapter); | 354 | zfcp_erp_wait(adapter); |
| 366 | zfcp_port_put(adapter->nameserver_port); | ||
| 367 | } | 355 | } |
| 368 | return !atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED, | 356 | return !atomic_test_mask(ZFCP_STATUS_COMMON_UNBLOCKED, |
| 369 | &adapter->nameserver_port->status); | 357 | &adapter->nameserver_port->status); |
| @@ -475,7 +463,7 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft) | |||
| 475 | struct zfcp_adapter *adapter = ct->port->adapter; | 463 | struct zfcp_adapter *adapter = ct->port->adapter; |
| 476 | struct zfcp_port *port, *tmp; | 464 | struct zfcp_port *port, *tmp; |
| 477 | u32 d_id; | 465 | u32 d_id; |
| 478 | int ret = 0, x; | 466 | int ret = 0, x, last = 0; |
| 479 | 467 | ||
| 480 | if (ct->status) | 468 | if (ct->status) |
| 481 | return -EIO; | 469 | return -EIO; |
| @@ -492,19 +480,24 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft) | |||
| 492 | down(&zfcp_data.config_sema); | 480 | down(&zfcp_data.config_sema); |
| 493 | 481 | ||
| 494 | /* first entry is the header */ | 482 | /* first entry is the header */ |
| 495 | for (x = 1; x < ZFCP_GPN_FT_MAX_ENTRIES; x++) { | 483 | for (x = 1; x < ZFCP_GPN_FT_MAX_ENTRIES && !last; x++) { |
| 496 | if (x % (ZFCP_GPN_FT_ENTRIES + 1)) | 484 | if (x % (ZFCP_GPN_FT_ENTRIES + 1)) |
| 497 | acc++; | 485 | acc++; |
| 498 | else | 486 | else |
| 499 | acc = sg_virt(++sg); | 487 | acc = sg_virt(++sg); |
| 500 | 488 | ||
| 489 | last = acc->control & 0x80; | ||
| 501 | d_id = acc->port_id[0] << 16 | acc->port_id[1] << 8 | | 490 | d_id = acc->port_id[0] << 16 | acc->port_id[1] << 8 | |
| 502 | acc->port_id[2]; | 491 | acc->port_id[2]; |
| 503 | 492 | ||
| 504 | /* skip the adapter's port and known remote ports */ | 493 | /* skip the adapter's port and known remote ports */ |
| 505 | if (acc->wwpn == fc_host_port_name(adapter->scsi_host) || | 494 | if (acc->wwpn == fc_host_port_name(adapter->scsi_host)) |
| 506 | zfcp_get_port_by_did(adapter, d_id)) | 495 | continue; |
| 496 | port = zfcp_get_port_by_wwpn(adapter, acc->wwpn); | ||
| 497 | if (port) { | ||
| 498 | zfcp_port_get(port); | ||
| 507 | continue; | 499 | continue; |
| 500 | } | ||
| 508 | 501 | ||
| 509 | port = zfcp_port_enqueue(adapter, acc->wwpn, | 502 | port = zfcp_port_enqueue(adapter, acc->wwpn, |
| 510 | ZFCP_STATUS_PORT_DID_DID | | 503 | ZFCP_STATUS_PORT_DID_DID | |
| @@ -513,8 +506,6 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft) | |||
| 513 | ret = PTR_ERR(port); | 506 | ret = PTR_ERR(port); |
| 514 | else | 507 | else |
| 515 | zfcp_erp_port_reopen(port, 0, 149, NULL); | 508 | zfcp_erp_port_reopen(port, 0, 149, NULL); |
| 516 | if (acc->control & 0x80) /* last entry */ | ||
| 517 | break; | ||
| 518 | } | 509 | } |
| 519 | 510 | ||
| 520 | zfcp_erp_wait(adapter); | 511 | zfcp_erp_wait(adapter); |
