diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_bsg.c')
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_bsg.c | 49 |
1 files changed, 46 insertions, 3 deletions
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c index 71ff340f6de4..524f9eb7fcd1 100644 --- a/drivers/scsi/qla2xxx/qla_bsg.c +++ b/drivers/scsi/qla2xxx/qla_bsg.c | |||
| @@ -1,6 +1,6 @@ | |||
| 1 | /* | 1 | /* |
| 2 | * QLogic Fibre Channel HBA Driver | 2 | * QLogic Fibre Channel HBA Driver |
| 3 | * Copyright (c) 2003-2012 QLogic Corporation | 3 | * Copyright (c) 2003-2014 QLogic Corporation |
| 4 | * | 4 | * |
| 5 | * See LICENSE.qla2xxx for copyright and licensing details. | 5 | * See LICENSE.qla2xxx for copyright and licensing details. |
| 6 | */ | 6 | */ |
| @@ -2054,9 +2054,49 @@ qla26xx_serdes_op(struct fc_bsg_job *bsg_job) | |||
| 2054 | bsg_job->reply->reply_payload_rcv_len = sizeof(sr); | 2054 | bsg_job->reply->reply_payload_rcv_len = sizeof(sr); |
| 2055 | break; | 2055 | break; |
| 2056 | default: | 2056 | default: |
| 2057 | ql_log(ql_log_warn, vha, 0x708c, | 2057 | ql_dbg(ql_dbg_user, vha, 0x708c, |
| 2058 | "Unknown serdes cmd %x.\n", sr.cmd); | 2058 | "Unknown serdes cmd %x.\n", sr.cmd); |
| 2059 | rval = -EDOM; | 2059 | rval = -EINVAL; |
| 2060 | break; | ||
| 2061 | } | ||
| 2062 | |||
| 2063 | bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = | ||
| 2064 | rval ? EXT_STATUS_MAILBOX : 0; | ||
| 2065 | |||
| 2066 | bsg_job->reply_len = sizeof(struct fc_bsg_reply); | ||
| 2067 | bsg_job->reply->result = DID_OK << 16; | ||
| 2068 | bsg_job->job_done(bsg_job); | ||
| 2069 | return 0; | ||
| 2070 | } | ||
| 2071 | |||
| 2072 | static int | ||
| 2073 | qla8044_serdes_op(struct fc_bsg_job *bsg_job) | ||
| 2074 | { | ||
| 2075 | struct Scsi_Host *host = bsg_job->shost; | ||
| 2076 | scsi_qla_host_t *vha = shost_priv(host); | ||
| 2077 | int rval = 0; | ||
| 2078 | struct qla_serdes_reg_ex sr; | ||
| 2079 | |||
| 2080 | memset(&sr, 0, sizeof(sr)); | ||
| 2081 | |||
| 2082 | sg_copy_to_buffer(bsg_job->request_payload.sg_list, | ||
| 2083 | bsg_job->request_payload.sg_cnt, &sr, sizeof(sr)); | ||
| 2084 | |||
| 2085 | switch (sr.cmd) { | ||
| 2086 | case INT_SC_SERDES_WRITE_REG: | ||
| 2087 | rval = qla8044_write_serdes_word(vha, sr.addr, sr.val); | ||
| 2088 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
| 2089 | break; | ||
| 2090 | case INT_SC_SERDES_READ_REG: | ||
| 2091 | rval = qla8044_read_serdes_word(vha, sr.addr, &sr.val); | ||
| 2092 | sg_copy_from_buffer(bsg_job->reply_payload.sg_list, | ||
| 2093 | bsg_job->reply_payload.sg_cnt, &sr, sizeof(sr)); | ||
| 2094 | bsg_job->reply->reply_payload_rcv_len = sizeof(sr); | ||
| 2095 | break; | ||
| 2096 | default: | ||
| 2097 | ql_dbg(ql_dbg_user, vha, 0x70cf, | ||
| 2098 | "Unknown serdes cmd %x.\n", sr.cmd); | ||
| 2099 | rval = -EINVAL; | ||
| 2060 | break; | 2100 | break; |
| 2061 | } | 2101 | } |
| 2062 | 2102 | ||
| @@ -2121,6 +2161,9 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) | |||
| 2121 | case QL_VND_SERDES_OP: | 2161 | case QL_VND_SERDES_OP: |
| 2122 | return qla26xx_serdes_op(bsg_job); | 2162 | return qla26xx_serdes_op(bsg_job); |
| 2123 | 2163 | ||
| 2164 | case QL_VND_SERDES_OP_EX: | ||
| 2165 | return qla8044_serdes_op(bsg_job); | ||
| 2166 | |||
| 2124 | default: | 2167 | default: |
| 2125 | return -ENOSYS; | 2168 | return -ENOSYS; |
| 2126 | } | 2169 | } |
