diff options
author | Joe Carnuccio <joe.carnuccio@qlogic.com> | 2013-10-30 03:38:18 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2013-12-19 10:38:58 -0500 |
commit | db64e9301c067245928bfdbbd9c048cdba087927 (patch) | |
tree | 06050e3ddaf97d760073bedde26329ab684919e8 /drivers/scsi | |
parent | e8f5e95d5a7db8c8f195bc92c0ca8363223a0a9e (diff) |
[SCSI] qla2xxx: Add BSG interface for read/write serdes register.
Signed-off-by: Joe Carnuccio <joe.carnuccio@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
Diffstat (limited to 'drivers/scsi')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_bsg.c | 44 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_bsg.h | 13 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 3 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 5 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 69 |
6 files changed, 134 insertions, 2 deletions
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c index aa57bf0af574..f15d03e6b7ee 100644 --- a/drivers/scsi/qla2xxx/qla_bsg.c +++ b/drivers/scsi/qla2xxx/qla_bsg.c | |||
@@ -2022,6 +2022,46 @@ done: | |||
2022 | } | 2022 | } |
2023 | 2023 | ||
2024 | static int | 2024 | static int |
2025 | qla26xx_serdes_op(struct fc_bsg_job *bsg_job) | ||
2026 | { | ||
2027 | struct Scsi_Host *host = bsg_job->shost; | ||
2028 | scsi_qla_host_t *vha = shost_priv(host); | ||
2029 | int rval = 0; | ||
2030 | struct qla_serdes_reg sr; | ||
2031 | |||
2032 | memset(&sr, 0, sizeof(sr)); | ||
2033 | |||
2034 | sg_copy_to_buffer(bsg_job->request_payload.sg_list, | ||
2035 | bsg_job->request_payload.sg_cnt, &sr, sizeof(sr)); | ||
2036 | |||
2037 | switch (sr.cmd) { | ||
2038 | case INT_SC_SERDES_WRITE_REG: | ||
2039 | rval = qla2x00_write_serdes_word(vha, sr.addr, sr.val); | ||
2040 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
2041 | break; | ||
2042 | case INT_SC_SERDES_READ_REG: | ||
2043 | rval = qla2x00_read_serdes_word(vha, sr.addr, &sr.val); | ||
2044 | sg_copy_from_buffer(bsg_job->reply_payload.sg_list, | ||
2045 | bsg_job->reply_payload.sg_cnt, &sr, sizeof(sr)); | ||
2046 | bsg_job->reply->reply_payload_rcv_len = sizeof(sr); | ||
2047 | break; | ||
2048 | default: | ||
2049 | ql_log(ql_log_warn, vha, 0x708c, | ||
2050 | "Unknown serdes cmd %x.\n", sr.cmd); | ||
2051 | rval = -EDOM; | ||
2052 | break; | ||
2053 | } | ||
2054 | |||
2055 | bsg_job->reply->reply_data.vendor_reply.vendor_rsp[0] = | ||
2056 | rval ? EXT_STATUS_MAILBOX : 0; | ||
2057 | |||
2058 | bsg_job->reply_len = sizeof(struct fc_bsg_reply); | ||
2059 | bsg_job->reply->result = DID_OK << 16; | ||
2060 | bsg_job->job_done(bsg_job); | ||
2061 | return 0; | ||
2062 | } | ||
2063 | |||
2064 | static int | ||
2025 | qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) | 2065 | qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) |
2026 | { | 2066 | { |
2027 | switch (bsg_job->request->rqst_data.h_vendor.vendor_cmd[0]) { | 2067 | switch (bsg_job->request->rqst_data.h_vendor.vendor_cmd[0]) { |
@@ -2069,6 +2109,10 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) | |||
2069 | 2109 | ||
2070 | case QL_VND_FX00_MGMT_CMD: | 2110 | case QL_VND_FX00_MGMT_CMD: |
2071 | return qlafx00_mgmt_cmd(bsg_job); | 2111 | return qlafx00_mgmt_cmd(bsg_job); |
2112 | |||
2113 | case QL_VND_SERDES_OP: | ||
2114 | return qla26xx_serdes_op(bsg_job); | ||
2115 | |||
2072 | default: | 2116 | default: |
2073 | return -ENOSYS; | 2117 | return -ENOSYS; |
2074 | } | 2118 | } |
diff --git a/drivers/scsi/qla2xxx/qla_bsg.h b/drivers/scsi/qla2xxx/qla_bsg.h index 04f770332c2b..e5c2126221e9 100644 --- a/drivers/scsi/qla2xxx/qla_bsg.h +++ b/drivers/scsi/qla2xxx/qla_bsg.h | |||
@@ -23,6 +23,7 @@ | |||
23 | #define QL_VND_WRITE_I2C 0x10 | 23 | #define QL_VND_WRITE_I2C 0x10 |
24 | #define QL_VND_READ_I2C 0x11 | 24 | #define QL_VND_READ_I2C 0x11 |
25 | #define QL_VND_FX00_MGMT_CMD 0x12 | 25 | #define QL_VND_FX00_MGMT_CMD 0x12 |
26 | #define QL_VND_SERDES_OP 0x13 | ||
26 | 27 | ||
27 | /* BSG Vendor specific subcode returns */ | 28 | /* BSG Vendor specific subcode returns */ |
28 | #define EXT_STATUS_OK 0 | 29 | #define EXT_STATUS_OK 0 |
@@ -212,4 +213,16 @@ struct qla_i2c_access { | |||
212 | uint8_t buffer[0x40]; | 213 | uint8_t buffer[0x40]; |
213 | } __packed; | 214 | } __packed; |
214 | 215 | ||
216 | /* 26xx serdes register interface */ | ||
217 | |||
218 | /* serdes reg commands */ | ||
219 | #define INT_SC_SERDES_READ_REG 1 | ||
220 | #define INT_SC_SERDES_WRITE_REG 2 | ||
221 | |||
222 | struct qla_serdes_reg { | ||
223 | uint16_t cmd; | ||
224 | uint16_t addr; | ||
225 | uint16_t val; | ||
226 | } __packed; | ||
227 | |||
215 | #endif | 228 | #endif |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 66f6597d857b..9cd767c26a27 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -12,7 +12,7 @@ | |||
12 | * | Level | Last Value Used | Holes | | 12 | * | Level | Last Value Used | Holes | |
13 | * ---------------------------------------------------------------------- | 13 | * ---------------------------------------------------------------------- |
14 | * | Module Init and Probe | 0x015b | 0x4b,0xba,0xfa | | 14 | * | Module Init and Probe | 0x015b | 0x4b,0xba,0xfa | |
15 | * | Mailbox commands | 0x1181 | 0x111a-0x111b | | 15 | * | Mailbox commands | 0x1187 | 0x111a-0x111b | |
16 | * | | | 0x1155-0x1158 | | 16 | * | | | 0x1155-0x1158 | |
17 | * | | | 0x1018-0x1019 | | 17 | * | | | 0x1018-0x1019 | |
18 | * | | | 0x1115-0x1116 | | 18 | * | | | 0x1115-0x1116 | |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index ac62bcacc2d6..41d6491d7bd9 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -862,7 +862,6 @@ struct mbx_cmd_32 { | |||
862 | */ | 862 | */ |
863 | #define MBC_LOAD_RAM 1 /* Load RAM. */ | 863 | #define MBC_LOAD_RAM 1 /* Load RAM. */ |
864 | #define MBC_EXECUTE_FIRMWARE 2 /* Execute firmware. */ | 864 | #define MBC_EXECUTE_FIRMWARE 2 /* Execute firmware. */ |
865 | #define MBC_WRITE_RAM_WORD 4 /* Write RAM word. */ | ||
866 | #define MBC_READ_RAM_WORD 5 /* Read RAM word. */ | 865 | #define MBC_READ_RAM_WORD 5 /* Read RAM word. */ |
867 | #define MBC_MAILBOX_REGISTER_TEST 6 /* Wrap incoming mailboxes */ | 866 | #define MBC_MAILBOX_REGISTER_TEST 6 /* Wrap incoming mailboxes */ |
868 | #define MBC_VERIFY_CHECKSUM 7 /* Verify checksum. */ | 867 | #define MBC_VERIFY_CHECKSUM 7 /* Verify checksum. */ |
@@ -937,6 +936,8 @@ struct mbx_cmd_32 { | |||
937 | /* | 936 | /* |
938 | * ISP24xx mailbox commands | 937 | * ISP24xx mailbox commands |
939 | */ | 938 | */ |
939 | #define MBC_WRITE_SERDES 0x3 /* Write serdes word. */ | ||
940 | #define MBC_READ_SERDES 0x4 /* Read serdes word. */ | ||
940 | #define MBC_SERDES_PARAMS 0x10 /* Serdes Tx Parameters. */ | 941 | #define MBC_SERDES_PARAMS 0x10 /* Serdes Tx Parameters. */ |
941 | #define MBC_GET_IOCB_STATUS 0x12 /* Get IOCB status command. */ | 942 | #define MBC_GET_IOCB_STATUS 0x12 /* Get IOCB status command. */ |
942 | #define MBC_PORT_PARAMS 0x1A /* Port iDMA Parameters. */ | 943 | #define MBC_PORT_PARAMS 0x1A /* Port iDMA Parameters. */ |
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 359d0d9e09d9..00427e0ff5b2 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -341,6 +341,11 @@ extern int | |||
341 | qla2x00_system_error(scsi_qla_host_t *); | 341 | qla2x00_system_error(scsi_qla_host_t *); |
342 | 342 | ||
343 | extern int | 343 | extern int |
344 | qla2x00_write_serdes_word(scsi_qla_host_t *, uint16_t, uint16_t); | ||
345 | extern int | ||
346 | qla2x00_read_serdes_word(scsi_qla_host_t *, uint16_t, uint16_t *); | ||
347 | |||
348 | extern int | ||
344 | qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t); | 349 | qla2x00_set_serdes_params(scsi_qla_host_t *, uint16_t, uint16_t, uint16_t); |
345 | 350 | ||
346 | extern int | 351 | extern int |
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 5957fee119c9..b94511ae0051 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -2800,6 +2800,75 @@ qla2x00_system_error(scsi_qla_host_t *vha) | |||
2800 | return rval; | 2800 | return rval; |
2801 | } | 2801 | } |
2802 | 2802 | ||
2803 | int | ||
2804 | qla2x00_write_serdes_word(scsi_qla_host_t *vha, uint16_t addr, uint16_t data) | ||
2805 | { | ||
2806 | int rval; | ||
2807 | mbx_cmd_t mc; | ||
2808 | mbx_cmd_t *mcp = &mc; | ||
2809 | |||
2810 | if (!IS_QLA2031(vha->hw)) | ||
2811 | return QLA_FUNCTION_FAILED; | ||
2812 | |||
2813 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1182, | ||
2814 | "Entered %s.\n", __func__); | ||
2815 | |||
2816 | mcp->mb[0] = MBC_WRITE_SERDES; | ||
2817 | mcp->mb[1] = addr; | ||
2818 | mcp->mb[2] = data & 0xff; | ||
2819 | mcp->mb[3] = 0; | ||
2820 | mcp->out_mb = MBX_3|MBX_2|MBX_1|MBX_0; | ||
2821 | mcp->in_mb = MBX_0; | ||
2822 | mcp->tov = MBX_TOV_SECONDS; | ||
2823 | mcp->flags = 0; | ||
2824 | rval = qla2x00_mailbox_command(vha, mcp); | ||
2825 | |||
2826 | if (rval != QLA_SUCCESS) { | ||
2827 | ql_dbg(ql_dbg_mbx, vha, 0x1183, | ||
2828 | "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); | ||
2829 | } else { | ||
2830 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1184, | ||
2831 | "Done %s.\n", __func__); | ||
2832 | } | ||
2833 | |||
2834 | return rval; | ||
2835 | } | ||
2836 | |||
2837 | int | ||
2838 | qla2x00_read_serdes_word(scsi_qla_host_t *vha, uint16_t addr, uint16_t *data) | ||
2839 | { | ||
2840 | int rval; | ||
2841 | mbx_cmd_t mc; | ||
2842 | mbx_cmd_t *mcp = &mc; | ||
2843 | |||
2844 | if (!IS_QLA2031(vha->hw)) | ||
2845 | return QLA_FUNCTION_FAILED; | ||
2846 | |||
2847 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1185, | ||
2848 | "Entered %s.\n", __func__); | ||
2849 | |||
2850 | mcp->mb[0] = MBC_READ_SERDES; | ||
2851 | mcp->mb[1] = addr; | ||
2852 | mcp->mb[3] = 0; | ||
2853 | mcp->out_mb = MBX_3|MBX_1|MBX_0; | ||
2854 | mcp->in_mb = MBX_1|MBX_0; | ||
2855 | mcp->tov = MBX_TOV_SECONDS; | ||
2856 | mcp->flags = 0; | ||
2857 | rval = qla2x00_mailbox_command(vha, mcp); | ||
2858 | |||
2859 | *data = mcp->mb[1] & 0xff; | ||
2860 | |||
2861 | if (rval != QLA_SUCCESS) { | ||
2862 | ql_dbg(ql_dbg_mbx, vha, 0x1186, | ||
2863 | "Failed=%x mb[0]=%x.\n", rval, mcp->mb[0]); | ||
2864 | } else { | ||
2865 | ql_dbg(ql_dbg_mbx + ql_dbg_verbose, vha, 0x1187, | ||
2866 | "Done %s.\n", __func__); | ||
2867 | } | ||
2868 | |||
2869 | return rval; | ||
2870 | } | ||
2871 | |||
2803 | /** | 2872 | /** |
2804 | * qla2x00_set_serdes_params() - | 2873 | * qla2x00_set_serdes_params() - |
2805 | * @ha: HA context | 2874 | * @ha: HA context |