aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/ibmvscsi
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/ibmvscsi')
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc.c74
-rw-r--r--drivers/scsi/ibmvscsi/ibmvfc.h6
2 files changed, 56 insertions, 24 deletions
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.c b/drivers/scsi/ibmvscsi/ibmvfc.c
index a5dd9b4a0ae8..b1512e9d1b9d 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.c
+++ b/drivers/scsi/ibmvscsi/ibmvfc.c
@@ -2501,41 +2501,66 @@ static void ibmvfc_terminate_rport_io(struct fc_rport *rport)
2501 LEAVE; 2501 LEAVE;
2502} 2502}
2503 2503
2504static const struct { 2504static const struct ibmvfc_async_desc ae_desc [] = {
2505 enum ibmvfc_async_event ae; 2505 { IBMVFC_AE_ELS_PLOGI, "PLOGI", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2506 const char *desc; 2506 { IBMVFC_AE_ELS_LOGO, "LOGO", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2507} ae_desc [] = { 2507 { IBMVFC_AE_ELS_PRLO, "PRLO", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2508 { IBMVFC_AE_ELS_PLOGI, "PLOGI" }, 2508 { IBMVFC_AE_SCN_NPORT, "N-Port SCN", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2509 { IBMVFC_AE_ELS_LOGO, "LOGO" }, 2509 { IBMVFC_AE_SCN_GROUP, "Group SCN", IBMVFC_DEFAULT_LOG_LEVEL + 1 },
2510 { IBMVFC_AE_ELS_PRLO, "PRLO" }, 2510 { IBMVFC_AE_SCN_DOMAIN, "Domain SCN", IBMVFC_DEFAULT_LOG_LEVEL },
2511 { IBMVFC_AE_SCN_NPORT, "N-Port SCN" }, 2511 { IBMVFC_AE_SCN_FABRIC, "Fabric SCN", IBMVFC_DEFAULT_LOG_LEVEL },
2512 { IBMVFC_AE_SCN_GROUP, "Group SCN" }, 2512 { IBMVFC_AE_LINK_UP, "Link Up", IBMVFC_DEFAULT_LOG_LEVEL },
2513 { IBMVFC_AE_SCN_DOMAIN, "Domain SCN" }, 2513 { IBMVFC_AE_LINK_DOWN, "Link Down", IBMVFC_DEFAULT_LOG_LEVEL },
2514 { IBMVFC_AE_SCN_FABRIC, "Fabric SCN" }, 2514 { IBMVFC_AE_LINK_DEAD, "Link Dead", IBMVFC_DEFAULT_LOG_LEVEL },
2515 { IBMVFC_AE_LINK_UP, "Link Up" }, 2515 { IBMVFC_AE_HALT, "Halt", IBMVFC_DEFAULT_LOG_LEVEL },
2516 { IBMVFC_AE_LINK_DOWN, "Link Down" }, 2516 { IBMVFC_AE_RESUME, "Resume", IBMVFC_DEFAULT_LOG_LEVEL },
2517 { IBMVFC_AE_LINK_DEAD, "Link Dead" }, 2517 { IBMVFC_AE_ADAPTER_FAILED, "Adapter Failed", IBMVFC_DEFAULT_LOG_LEVEL },
2518 { IBMVFC_AE_HALT, "Halt" },
2519 { IBMVFC_AE_RESUME, "Resume" },
2520 { IBMVFC_AE_ADAPTER_FAILED, "Adapter Failed" },
2521}; 2518};
2522 2519
2523static const char *unknown_ae = "Unknown async"; 2520static const struct ibmvfc_async_desc unknown_ae = {
2521 0, "Unknown async", IBMVFC_DEFAULT_LOG_LEVEL
2522};
2524 2523
2525/** 2524/**
2526 * ibmvfc_get_ae_desc - Get text description for async event 2525 * ibmvfc_get_ae_desc - Get text description for async event
2527 * @ae: async event 2526 * @ae: async event
2528 * 2527 *
2529 **/ 2528 **/
2530static const char *ibmvfc_get_ae_desc(u64 ae) 2529static const struct ibmvfc_async_desc *ibmvfc_get_ae_desc(u64 ae)
2531{ 2530{
2532 int i; 2531 int i;
2533 2532
2534 for (i = 0; i < ARRAY_SIZE(ae_desc); i++) 2533 for (i = 0; i < ARRAY_SIZE(ae_desc); i++)
2535 if (ae_desc[i].ae == ae) 2534 if (ae_desc[i].ae == ae)
2536 return ae_desc[i].desc; 2535 return &ae_desc[i];
2536
2537 return &unknown_ae;
2538}
2539
2540static const struct {
2541 enum ibmvfc_ae_link_state state;
2542 const char *desc;
2543} link_desc [] = {
2544 { IBMVFC_AE_LS_LINK_UP, " link up" },
2545 { IBMVFC_AE_LS_LINK_BOUNCED, " link bounced" },
2546 { IBMVFC_AE_LS_LINK_DOWN, " link down" },
2547 { IBMVFC_AE_LS_LINK_DEAD, " link dead" },
2548};
2549
2550/**
2551 * ibmvfc_get_link_state - Get text description for link state
2552 * @state: link state
2553 *
2554 **/
2555static const char *ibmvfc_get_link_state(enum ibmvfc_ae_link_state state)
2556{
2557 int i;
2558
2559 for (i = 0; i < ARRAY_SIZE(link_desc); i++)
2560 if (link_desc[i].state == state)
2561 return link_desc[i].desc;
2537 2562
2538 return unknown_ae; 2563 return "";
2539} 2564}
2540 2565
2541/** 2566/**
@@ -2547,11 +2572,12 @@ static const char *ibmvfc_get_ae_desc(u64 ae)
2547static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq, 2572static void ibmvfc_handle_async(struct ibmvfc_async_crq *crq,
2548 struct ibmvfc_host *vhost) 2573 struct ibmvfc_host *vhost)
2549{ 2574{
2550 const char *desc = ibmvfc_get_ae_desc(crq->event); 2575 const struct ibmvfc_async_desc *desc = ibmvfc_get_ae_desc(crq->event);
2551 struct ibmvfc_target *tgt; 2576 struct ibmvfc_target *tgt;
2552 2577
2553 ibmvfc_log(vhost, 3, "%s event received. scsi_id: %llx, wwpn: %llx," 2578 ibmvfc_log(vhost, desc->log_level, "%s event received. scsi_id: %llx, wwpn: %llx,"
2554 " node_name: %llx\n", desc, crq->scsi_id, crq->wwpn, crq->node_name); 2579 " node_name: %llx%s\n", desc->desc, crq->scsi_id, crq->wwpn, crq->node_name,
2580 ibmvfc_get_link_state(crq->link_state));
2555 2581
2556 switch (crq->event) { 2582 switch (crq->event) {
2557 case IBMVFC_AE_RESUME: 2583 case IBMVFC_AE_RESUME:
diff --git a/drivers/scsi/ibmvscsi/ibmvfc.h b/drivers/scsi/ibmvscsi/ibmvfc.h
index 608af394c8cf..ef663e7c9bbc 100644
--- a/drivers/scsi/ibmvscsi/ibmvfc.h
+++ b/drivers/scsi/ibmvscsi/ibmvfc.h
@@ -541,6 +541,12 @@ enum ibmvfc_async_event {
541 IBMVFC_AE_ADAPTER_FAILED = 0x1000, 541 IBMVFC_AE_ADAPTER_FAILED = 0x1000,
542}; 542};
543 543
544struct ibmvfc_async_desc {
545 enum ibmvfc_async_event ae;
546 const char *desc;
547 int log_level;
548};
549
544struct ibmvfc_crq { 550struct ibmvfc_crq {
545 volatile u8 valid; 551 volatile u8 valid;
546 volatile u8 format; 552 volatile u8 format;