diff options
author | Christof Schmitt <christof.schmitt@de.ibm.com> | 2010-04-30 12:09:34 -0400 |
---|---|---|
committer | James Bottomley <James.Bottomley@suse.de> | 2010-05-02 15:42:30 -0400 |
commit | 1674b4054744c2cfd6573e43eca45d86ff581d0e (patch) | |
tree | 6a59f4f00b15b30313c330e9636b36c88c93a1c9 /drivers | |
parent | 683229845f1780b10041ee7a1043fc8f10061455 (diff) |
[SCSI] zfcp: Move sbale handling to zfcp_qdio files
Move the code accessing the qdio sbales and zfcp_qdio_req struct to
the zfcp_qdio files and provide helper functions for accessing the
qdio related parts.
Reviewed-by: Swen Schillig <swen@vnet.ibm.com>
Signed-off-by: Christof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/s390/scsi/zfcp_def.h | 17 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_ext.h | 5 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fsf.c | 180 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_fsf.h | 9 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_qdio.c | 25 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_qdio.h | 102 | ||||
-rw-r--r-- | drivers/s390/scsi/zfcp_scsi.c | 4 |
7 files changed, 191 insertions, 151 deletions
diff --git a/drivers/s390/scsi/zfcp_def.h b/drivers/s390/scsi/zfcp_def.h index 72132c13f45b..0b2ae60a6f9f 100644 --- a/drivers/s390/scsi/zfcp_def.h +++ b/drivers/s390/scsi/zfcp_def.h | |||
@@ -44,23 +44,6 @@ struct zfcp_reqlist; | |||
44 | /********************* SCSI SPECIFIC DEFINES *********************************/ | 44 | /********************* SCSI SPECIFIC DEFINES *********************************/ |
45 | #define ZFCP_SCSI_ER_TIMEOUT (10*HZ) | 45 | #define ZFCP_SCSI_ER_TIMEOUT (10*HZ) |
46 | 46 | ||
47 | /********************* CIO/QDIO SPECIFIC DEFINES *****************************/ | ||
48 | |||
49 | /* DMQ bug workaround: don't use last SBALE */ | ||
50 | #define ZFCP_MAX_SBALES_PER_SBAL (QDIO_MAX_ELEMENTS_PER_BUFFER - 1) | ||
51 | |||
52 | /* index of last SBALE (with respect to DMQ bug workaround) */ | ||
53 | #define ZFCP_LAST_SBALE_PER_SBAL (ZFCP_MAX_SBALES_PER_SBAL - 1) | ||
54 | |||
55 | /* max. number of (data buffer) SBALEs in largest SBAL chain */ | ||
56 | #define ZFCP_MAX_SBALES_PER_REQ \ | ||
57 | (FSF_MAX_SBALS_PER_REQ * ZFCP_MAX_SBALES_PER_SBAL - 2) | ||
58 | /* request ID + QTCB in SBALE 0 + 1 of first SBAL in chain */ | ||
59 | |||
60 | #define ZFCP_MAX_SECTORS (ZFCP_MAX_SBALES_PER_REQ * 8) | ||
61 | /* max. number of (data buffer) SBALEs in largest SBAL chain | ||
62 | multiplied with number of sectors per 4k block */ | ||
63 | |||
64 | /********************* FSF SPECIFIC DEFINES *********************************/ | 47 | /********************* FSF SPECIFIC DEFINES *********************************/ |
65 | 48 | ||
66 | /* ATTENTION: value must not be used by hardware */ | 49 | /* ATTENTION: value must not be used by hardware */ |
diff --git a/drivers/s390/scsi/zfcp_ext.h b/drivers/s390/scsi/zfcp_ext.h index 8786a79c7f8f..172da12a2d02 100644 --- a/drivers/s390/scsi/zfcp_ext.h +++ b/drivers/s390/scsi/zfcp_ext.h | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * External function declarations. | 4 | * External function declarations. |
5 | * | 5 | * |
6 | * Copyright IBM Corporation 2002, 2009 | 6 | * Copyright IBM Corporation 2002, 2010 |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #ifndef ZFCP_EXT_H | 9 | #ifndef ZFCP_EXT_H |
@@ -144,8 +144,7 @@ extern void zfcp_fsf_reqid_check(struct zfcp_qdio *, int); | |||
144 | extern int zfcp_qdio_setup(struct zfcp_adapter *); | 144 | extern int zfcp_qdio_setup(struct zfcp_adapter *); |
145 | extern void zfcp_qdio_destroy(struct zfcp_qdio *); | 145 | extern void zfcp_qdio_destroy(struct zfcp_qdio *); |
146 | extern int zfcp_qdio_send(struct zfcp_qdio *, struct zfcp_qdio_req *); | 146 | extern int zfcp_qdio_send(struct zfcp_qdio *, struct zfcp_qdio_req *); |
147 | extern int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *, | 147 | extern int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *, struct zfcp_qdio_req *, |
148 | struct zfcp_qdio_req *, unsigned long, | ||
149 | struct scatterlist *, int); | 148 | struct scatterlist *, int); |
150 | extern int zfcp_qdio_open(struct zfcp_qdio *); | 149 | extern int zfcp_qdio_open(struct zfcp_qdio *); |
151 | extern void zfcp_qdio_close(struct zfcp_qdio *); | 150 | extern void zfcp_qdio_close(struct zfcp_qdio *); |
diff --git a/drivers/s390/scsi/zfcp_fsf.c b/drivers/s390/scsi/zfcp_fsf.c index 18564891ea61..ec1b49a75532 100644 --- a/drivers/s390/scsi/zfcp_fsf.c +++ b/drivers/s390/scsi/zfcp_fsf.c | |||
@@ -705,10 +705,9 @@ static struct fsf_qtcb *zfcp_qtcb_alloc(mempool_t *pool) | |||
705 | } | 705 | } |
706 | 706 | ||
707 | static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio, | 707 | static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio, |
708 | u32 fsf_cmd, mempool_t *pool) | 708 | u32 fsf_cmd, u32 sbtype, |
709 | mempool_t *pool) | ||
709 | { | 710 | { |
710 | struct qdio_buffer_element *sbale; | ||
711 | struct zfcp_qdio_queue *req_q = &qdio->req_q; | ||
712 | struct zfcp_adapter *adapter = qdio->adapter; | 711 | struct zfcp_adapter *adapter = qdio->adapter; |
713 | struct zfcp_fsf_req *req = zfcp_fsf_alloc(pool); | 712 | struct zfcp_fsf_req *req = zfcp_fsf_alloc(pool); |
714 | 713 | ||
@@ -725,14 +724,6 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio, | |||
725 | req->adapter = adapter; | 724 | req->adapter = adapter; |
726 | req->fsf_command = fsf_cmd; | 725 | req->fsf_command = fsf_cmd; |
727 | req->req_id = adapter->req_no; | 726 | req->req_id = adapter->req_no; |
728 | req->qdio_req.sbal_number = 1; | ||
729 | req->qdio_req.sbal_first = req_q->first; | ||
730 | req->qdio_req.sbal_last = req_q->first; | ||
731 | req->qdio_req.sbale_curr = 1; | ||
732 | |||
733 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | ||
734 | sbale[0].addr = (void *) req->req_id; | ||
735 | sbale[0].flags |= SBAL_FLAGS0_COMMAND; | ||
736 | 727 | ||
737 | if (likely(fsf_cmd != FSF_QTCB_UNSOLICITED_STATUS)) { | 728 | if (likely(fsf_cmd != FSF_QTCB_UNSOLICITED_STATUS)) { |
738 | if (likely(pool)) | 729 | if (likely(pool)) |
@@ -753,10 +744,11 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_qdio *qdio, | |||
753 | req->qtcb->prefix.qtcb_version = FSF_QTCB_CURRENT_VERSION; | 744 | req->qtcb->prefix.qtcb_version = FSF_QTCB_CURRENT_VERSION; |
754 | req->qtcb->header.req_handle = req->req_id; | 745 | req->qtcb->header.req_handle = req->req_id; |
755 | req->qtcb->header.fsf_command = req->fsf_command; | 746 | req->qtcb->header.fsf_command = req->fsf_command; |
756 | sbale[1].addr = (void *) req->qtcb; | ||
757 | sbale[1].length = sizeof(struct fsf_qtcb); | ||
758 | } | 747 | } |
759 | 748 | ||
749 | zfcp_qdio_req_init(adapter->qdio, &req->qdio_req, req->req_id, sbtype, | ||
750 | req->qtcb, sizeof(struct fsf_qtcb)); | ||
751 | |||
760 | if (!(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) { | 752 | if (!(atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_QDIOUP)) { |
761 | zfcp_fsf_req_free(req); | 753 | zfcp_fsf_req_free(req); |
762 | return ERR_PTR(-EIO); | 754 | return ERR_PTR(-EIO); |
@@ -803,24 +795,19 @@ int zfcp_fsf_status_read(struct zfcp_qdio *qdio) | |||
803 | struct zfcp_adapter *adapter = qdio->adapter; | 795 | struct zfcp_adapter *adapter = qdio->adapter; |
804 | struct zfcp_fsf_req *req; | 796 | struct zfcp_fsf_req *req; |
805 | struct fsf_status_read_buffer *sr_buf; | 797 | struct fsf_status_read_buffer *sr_buf; |
806 | struct qdio_buffer_element *sbale; | ||
807 | int retval = -EIO; | 798 | int retval = -EIO; |
808 | 799 | ||
809 | spin_lock_bh(&qdio->req_q_lock); | 800 | spin_lock_bh(&qdio->req_q_lock); |
810 | if (zfcp_fsf_req_sbal_get(qdio)) | 801 | if (zfcp_fsf_req_sbal_get(qdio)) |
811 | goto out; | 802 | goto out; |
812 | 803 | ||
813 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_UNSOLICITED_STATUS, | 804 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_UNSOLICITED_STATUS, 0, |
814 | adapter->pool.status_read_req); | 805 | adapter->pool.status_read_req); |
815 | if (IS_ERR(req)) { | 806 | if (IS_ERR(req)) { |
816 | retval = PTR_ERR(req); | 807 | retval = PTR_ERR(req); |
817 | goto out; | 808 | goto out; |
818 | } | 809 | } |
819 | 810 | ||
820 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | ||
821 | sbale[2].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
822 | req->qdio_req.sbale_curr = 2; | ||
823 | |||
824 | sr_buf = mempool_alloc(adapter->pool.status_read_data, GFP_ATOMIC); | 811 | sr_buf = mempool_alloc(adapter->pool.status_read_data, GFP_ATOMIC); |
825 | if (!sr_buf) { | 812 | if (!sr_buf) { |
826 | retval = -ENOMEM; | 813 | retval = -ENOMEM; |
@@ -828,9 +815,9 @@ int zfcp_fsf_status_read(struct zfcp_qdio *qdio) | |||
828 | } | 815 | } |
829 | memset(sr_buf, 0, sizeof(*sr_buf)); | 816 | memset(sr_buf, 0, sizeof(*sr_buf)); |
830 | req->data = sr_buf; | 817 | req->data = sr_buf; |
831 | sbale = zfcp_qdio_sbale_curr(qdio, &req->qdio_req); | 818 | |
832 | sbale->addr = (void *) sr_buf; | 819 | zfcp_qdio_fill_next(qdio, &req->qdio_req, sr_buf, sizeof(*sr_buf)); |
833 | sbale->length = sizeof(*sr_buf); | 820 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
834 | 821 | ||
835 | retval = zfcp_fsf_req_send(req); | 822 | retval = zfcp_fsf_req_send(req); |
836 | if (retval) | 823 | if (retval) |
@@ -907,7 +894,6 @@ static void zfcp_fsf_abort_fcp_command_handler(struct zfcp_fsf_req *req) | |||
907 | struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id, | 894 | struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id, |
908 | struct zfcp_unit *unit) | 895 | struct zfcp_unit *unit) |
909 | { | 896 | { |
910 | struct qdio_buffer_element *sbale; | ||
911 | struct zfcp_fsf_req *req = NULL; | 897 | struct zfcp_fsf_req *req = NULL; |
912 | struct zfcp_qdio *qdio = unit->port->adapter->qdio; | 898 | struct zfcp_qdio *qdio = unit->port->adapter->qdio; |
913 | 899 | ||
@@ -915,6 +901,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id, | |||
915 | if (zfcp_fsf_req_sbal_get(qdio)) | 901 | if (zfcp_fsf_req_sbal_get(qdio)) |
916 | goto out; | 902 | goto out; |
917 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_ABORT_FCP_CMND, | 903 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_ABORT_FCP_CMND, |
904 | SBAL_FLAGS0_TYPE_READ, | ||
918 | qdio->adapter->pool.scsi_abort); | 905 | qdio->adapter->pool.scsi_abort); |
919 | if (IS_ERR(req)) { | 906 | if (IS_ERR(req)) { |
920 | req = NULL; | 907 | req = NULL; |
@@ -925,9 +912,7 @@ struct zfcp_fsf_req *zfcp_fsf_abort_fcp_command(unsigned long old_req_id, | |||
925 | ZFCP_STATUS_COMMON_UNBLOCKED))) | 912 | ZFCP_STATUS_COMMON_UNBLOCKED))) |
926 | goto out_error_free; | 913 | goto out_error_free; |
927 | 914 | ||
928 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 915 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
929 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
930 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
931 | 916 | ||
932 | req->data = unit; | 917 | req->data = unit; |
933 | req->handler = zfcp_fsf_abort_fcp_command_handler; | 918 | req->handler = zfcp_fsf_abort_fcp_command_handler; |
@@ -996,21 +981,14 @@ skip_fsfstatus: | |||
996 | ct->handler(ct->handler_data); | 981 | ct->handler(ct->handler_data); |
997 | } | 982 | } |
998 | 983 | ||
999 | static void zfcp_fsf_setup_ct_els_unchained(struct qdio_buffer_element *sbale, | 984 | static void zfcp_fsf_setup_ct_els_unchained(struct zfcp_qdio *qdio, |
985 | struct zfcp_qdio_req *q_req, | ||
1000 | struct scatterlist *sg_req, | 986 | struct scatterlist *sg_req, |
1001 | struct scatterlist *sg_resp) | 987 | struct scatterlist *sg_resp) |
1002 | { | 988 | { |
1003 | sbale[0].flags |= SBAL_FLAGS0_TYPE_WRITE_READ; | 989 | zfcp_qdio_fill_next(qdio, q_req, sg_virt(sg_req), sg_req->length); |
1004 | sbale[2].addr = sg_virt(sg_req); | 990 | zfcp_qdio_fill_next(qdio, q_req, sg_virt(sg_resp), sg_resp->length); |
1005 | sbale[2].length = sg_req->length; | 991 | zfcp_qdio_set_sbale_last(qdio, q_req); |
1006 | sbale[3].addr = sg_virt(sg_resp); | ||
1007 | sbale[3].length = sg_resp->length; | ||
1008 | sbale[3].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1009 | } | ||
1010 | |||
1011 | static int zfcp_fsf_one_sbal(struct scatterlist *sg) | ||
1012 | { | ||
1013 | return sg_is_last(sg) && sg->length <= PAGE_SIZE; | ||
1014 | } | 992 | } |
1015 | 993 | ||
1016 | static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req, | 994 | static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req, |
@@ -1019,35 +997,34 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req, | |||
1019 | int max_sbals) | 997 | int max_sbals) |
1020 | { | 998 | { |
1021 | struct zfcp_adapter *adapter = req->adapter; | 999 | struct zfcp_adapter *adapter = req->adapter; |
1022 | struct qdio_buffer_element *sbale = zfcp_qdio_sbale_req(adapter->qdio, | ||
1023 | &req->qdio_req); | ||
1024 | u32 feat = adapter->adapter_features; | 1000 | u32 feat = adapter->adapter_features; |
1025 | int bytes; | 1001 | int bytes; |
1026 | 1002 | ||
1027 | if (!(feat & FSF_FEATURE_ELS_CT_CHAINED_SBALS)) { | 1003 | if (!(feat & FSF_FEATURE_ELS_CT_CHAINED_SBALS)) { |
1028 | if (!zfcp_fsf_one_sbal(sg_req) || !zfcp_fsf_one_sbal(sg_resp)) | 1004 | if (!zfcp_qdio_sg_one_sbale(sg_req) || |
1005 | !zfcp_qdio_sg_one_sbale(sg_resp)) | ||
1029 | return -EOPNOTSUPP; | 1006 | return -EOPNOTSUPP; |
1030 | 1007 | ||
1031 | zfcp_fsf_setup_ct_els_unchained(sbale, sg_req, sg_resp); | 1008 | zfcp_fsf_setup_ct_els_unchained(adapter->qdio, &req->qdio_req, |
1009 | sg_req, sg_resp); | ||
1032 | return 0; | 1010 | return 0; |
1033 | } | 1011 | } |
1034 | 1012 | ||
1035 | /* use single, unchained SBAL if it can hold the request */ | 1013 | /* use single, unchained SBAL if it can hold the request */ |
1036 | if (zfcp_fsf_one_sbal(sg_req) && zfcp_fsf_one_sbal(sg_resp)) { | 1014 | if (zfcp_qdio_sg_one_sbale(sg_req) || zfcp_qdio_sg_one_sbale(sg_resp)) { |
1037 | zfcp_fsf_setup_ct_els_unchained(sbale, sg_req, sg_resp); | 1015 | zfcp_fsf_setup_ct_els_unchained(adapter->qdio, &req->qdio_req, |
1016 | sg_req, sg_resp); | ||
1038 | return 0; | 1017 | return 0; |
1039 | } | 1018 | } |
1040 | 1019 | ||
1041 | bytes = zfcp_qdio_sbals_from_sg(adapter->qdio, &req->qdio_req, | 1020 | bytes = zfcp_qdio_sbals_from_sg(adapter->qdio, &req->qdio_req, |
1042 | SBAL_FLAGS0_TYPE_WRITE_READ, | ||
1043 | sg_req, max_sbals); | 1021 | sg_req, max_sbals); |
1044 | if (bytes <= 0) | 1022 | if (bytes <= 0) |
1045 | return -EIO; | 1023 | return -EIO; |
1046 | req->qtcb->bottom.support.req_buf_length = bytes; | 1024 | req->qtcb->bottom.support.req_buf_length = bytes; |
1047 | req->qdio_req.sbale_curr = ZFCP_LAST_SBALE_PER_SBAL; | 1025 | zfcp_qdio_skip_to_last_sbale(&req->qdio_req); |
1048 | 1026 | ||
1049 | bytes = zfcp_qdio_sbals_from_sg(adapter->qdio, &req->qdio_req, | 1027 | bytes = zfcp_qdio_sbals_from_sg(adapter->qdio, &req->qdio_req, |
1050 | SBAL_FLAGS0_TYPE_WRITE_READ, | ||
1051 | sg_resp, max_sbals); | 1028 | sg_resp, max_sbals); |
1052 | req->qtcb->bottom.support.resp_buf_length = bytes; | 1029 | req->qtcb->bottom.support.resp_buf_length = bytes; |
1053 | if (bytes <= 0) | 1030 | if (bytes <= 0) |
@@ -1094,7 +1071,8 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, | |||
1094 | if (zfcp_fsf_req_sbal_get(qdio)) | 1071 | if (zfcp_fsf_req_sbal_get(qdio)) |
1095 | goto out; | 1072 | goto out; |
1096 | 1073 | ||
1097 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_GENERIC, pool); | 1074 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_GENERIC, |
1075 | SBAL_FLAGS0_TYPE_WRITE_READ, pool); | ||
1098 | 1076 | ||
1099 | if (IS_ERR(req)) { | 1077 | if (IS_ERR(req)) { |
1100 | ret = PTR_ERR(req); | 1078 | ret = PTR_ERR(req); |
@@ -1103,7 +1081,7 @@ int zfcp_fsf_send_ct(struct zfcp_fc_wka_port *wka_port, | |||
1103 | 1081 | ||
1104 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1082 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
1105 | ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp, | 1083 | ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp, |
1106 | FSF_MAX_SBALS_PER_REQ, timeout); | 1084 | ZFCP_FSF_MAX_SBALS_PER_REQ, timeout); |
1107 | if (ret) | 1085 | if (ret) |
1108 | goto failed_send; | 1086 | goto failed_send; |
1109 | 1087 | ||
@@ -1190,7 +1168,8 @@ int zfcp_fsf_send_els(struct zfcp_adapter *adapter, u32 d_id, | |||
1190 | if (zfcp_fsf_req_sbal_get(qdio)) | 1168 | if (zfcp_fsf_req_sbal_get(qdio)) |
1191 | goto out; | 1169 | goto out; |
1192 | 1170 | ||
1193 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_ELS, NULL); | 1171 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_SEND_ELS, |
1172 | SBAL_FLAGS0_TYPE_WRITE_READ, NULL); | ||
1194 | 1173 | ||
1195 | if (IS_ERR(req)) { | 1174 | if (IS_ERR(req)) { |
1196 | ret = PTR_ERR(req); | 1175 | ret = PTR_ERR(req); |
@@ -1224,7 +1203,6 @@ out: | |||
1224 | 1203 | ||
1225 | int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) | 1204 | int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) |
1226 | { | 1205 | { |
1227 | struct qdio_buffer_element *sbale; | ||
1228 | struct zfcp_fsf_req *req; | 1206 | struct zfcp_fsf_req *req; |
1229 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; | 1207 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; |
1230 | int retval = -EIO; | 1208 | int retval = -EIO; |
@@ -1234,6 +1212,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) | |||
1234 | goto out; | 1212 | goto out; |
1235 | 1213 | ||
1236 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA, | 1214 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA, |
1215 | SBAL_FLAGS0_TYPE_READ, | ||
1237 | qdio->adapter->pool.erp_req); | 1216 | qdio->adapter->pool.erp_req); |
1238 | 1217 | ||
1239 | if (IS_ERR(req)) { | 1218 | if (IS_ERR(req)) { |
@@ -1242,9 +1221,7 @@ int zfcp_fsf_exchange_config_data(struct zfcp_erp_action *erp_action) | |||
1242 | } | 1221 | } |
1243 | 1222 | ||
1244 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1223 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
1245 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1224 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1246 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1247 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1248 | 1225 | ||
1249 | req->qtcb->bottom.config.feature_selection = | 1226 | req->qtcb->bottom.config.feature_selection = |
1250 | FSF_FEATURE_CFDC | | 1227 | FSF_FEATURE_CFDC | |
@@ -1269,7 +1246,6 @@ out: | |||
1269 | int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio, | 1246 | int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio, |
1270 | struct fsf_qtcb_bottom_config *data) | 1247 | struct fsf_qtcb_bottom_config *data) |
1271 | { | 1248 | { |
1272 | struct qdio_buffer_element *sbale; | ||
1273 | struct zfcp_fsf_req *req = NULL; | 1249 | struct zfcp_fsf_req *req = NULL; |
1274 | int retval = -EIO; | 1250 | int retval = -EIO; |
1275 | 1251 | ||
@@ -1277,16 +1253,15 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_qdio *qdio, | |||
1277 | if (zfcp_fsf_req_sbal_get(qdio)) | 1253 | if (zfcp_fsf_req_sbal_get(qdio)) |
1278 | goto out_unlock; | 1254 | goto out_unlock; |
1279 | 1255 | ||
1280 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA, NULL); | 1256 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_CONFIG_DATA, |
1257 | SBAL_FLAGS0_TYPE_READ, NULL); | ||
1281 | 1258 | ||
1282 | if (IS_ERR(req)) { | 1259 | if (IS_ERR(req)) { |
1283 | retval = PTR_ERR(req); | 1260 | retval = PTR_ERR(req); |
1284 | goto out_unlock; | 1261 | goto out_unlock; |
1285 | } | 1262 | } |
1286 | 1263 | ||
1287 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1264 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1288 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1289 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1290 | req->handler = zfcp_fsf_exchange_config_data_handler; | 1265 | req->handler = zfcp_fsf_exchange_config_data_handler; |
1291 | 1266 | ||
1292 | req->qtcb->bottom.config.feature_selection = | 1267 | req->qtcb->bottom.config.feature_selection = |
@@ -1320,7 +1295,6 @@ out_unlock: | |||
1320 | int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) | 1295 | int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) |
1321 | { | 1296 | { |
1322 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; | 1297 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; |
1323 | struct qdio_buffer_element *sbale; | ||
1324 | struct zfcp_fsf_req *req; | 1298 | struct zfcp_fsf_req *req; |
1325 | int retval = -EIO; | 1299 | int retval = -EIO; |
1326 | 1300 | ||
@@ -1332,6 +1306,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) | |||
1332 | goto out; | 1306 | goto out; |
1333 | 1307 | ||
1334 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA, | 1308 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA, |
1309 | SBAL_FLAGS0_TYPE_READ, | ||
1335 | qdio->adapter->pool.erp_req); | 1310 | qdio->adapter->pool.erp_req); |
1336 | 1311 | ||
1337 | if (IS_ERR(req)) { | 1312 | if (IS_ERR(req)) { |
@@ -1340,9 +1315,7 @@ int zfcp_fsf_exchange_port_data(struct zfcp_erp_action *erp_action) | |||
1340 | } | 1315 | } |
1341 | 1316 | ||
1342 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1317 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
1343 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1318 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1344 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1345 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1346 | 1319 | ||
1347 | req->handler = zfcp_fsf_exchange_port_data_handler; | 1320 | req->handler = zfcp_fsf_exchange_port_data_handler; |
1348 | req->erp_action = erp_action; | 1321 | req->erp_action = erp_action; |
@@ -1368,7 +1341,6 @@ out: | |||
1368 | int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio, | 1341 | int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio, |
1369 | struct fsf_qtcb_bottom_port *data) | 1342 | struct fsf_qtcb_bottom_port *data) |
1370 | { | 1343 | { |
1371 | struct qdio_buffer_element *sbale; | ||
1372 | struct zfcp_fsf_req *req = NULL; | 1344 | struct zfcp_fsf_req *req = NULL; |
1373 | int retval = -EIO; | 1345 | int retval = -EIO; |
1374 | 1346 | ||
@@ -1379,7 +1351,8 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio, | |||
1379 | if (zfcp_fsf_req_sbal_get(qdio)) | 1351 | if (zfcp_fsf_req_sbal_get(qdio)) |
1380 | goto out_unlock; | 1352 | goto out_unlock; |
1381 | 1353 | ||
1382 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA, NULL); | 1354 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_EXCHANGE_PORT_DATA, |
1355 | SBAL_FLAGS0_TYPE_READ, NULL); | ||
1383 | 1356 | ||
1384 | if (IS_ERR(req)) { | 1357 | if (IS_ERR(req)) { |
1385 | retval = PTR_ERR(req); | 1358 | retval = PTR_ERR(req); |
@@ -1389,9 +1362,7 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_qdio *qdio, | |||
1389 | if (data) | 1362 | if (data) |
1390 | req->data = data; | 1363 | req->data = data; |
1391 | 1364 | ||
1392 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1365 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1393 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1394 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1395 | 1366 | ||
1396 | req->handler = zfcp_fsf_exchange_port_data_handler; | 1367 | req->handler = zfcp_fsf_exchange_port_data_handler; |
1397 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); | 1368 | zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT); |
@@ -1485,7 +1456,6 @@ out: | |||
1485 | */ | 1456 | */ |
1486 | int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) | 1457 | int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) |
1487 | { | 1458 | { |
1488 | struct qdio_buffer_element *sbale; | ||
1489 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; | 1459 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; |
1490 | struct zfcp_port *port = erp_action->port; | 1460 | struct zfcp_port *port = erp_action->port; |
1491 | struct zfcp_fsf_req *req; | 1461 | struct zfcp_fsf_req *req; |
@@ -1496,6 +1466,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) | |||
1496 | goto out; | 1466 | goto out; |
1497 | 1467 | ||
1498 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID, | 1468 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID, |
1469 | SBAL_FLAGS0_TYPE_READ, | ||
1499 | qdio->adapter->pool.erp_req); | 1470 | qdio->adapter->pool.erp_req); |
1500 | 1471 | ||
1501 | if (IS_ERR(req)) { | 1472 | if (IS_ERR(req)) { |
@@ -1504,9 +1475,7 @@ int zfcp_fsf_open_port(struct zfcp_erp_action *erp_action) | |||
1504 | } | 1475 | } |
1505 | 1476 | ||
1506 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1477 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
1507 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1478 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1508 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1509 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1510 | 1479 | ||
1511 | req->handler = zfcp_fsf_open_port_handler; | 1480 | req->handler = zfcp_fsf_open_port_handler; |
1512 | hton24(req->qtcb->bottom.support.d_id, port->d_id); | 1481 | hton24(req->qtcb->bottom.support.d_id, port->d_id); |
@@ -1556,7 +1525,6 @@ static void zfcp_fsf_close_port_handler(struct zfcp_fsf_req *req) | |||
1556 | */ | 1525 | */ |
1557 | int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) | 1526 | int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) |
1558 | { | 1527 | { |
1559 | struct qdio_buffer_element *sbale; | ||
1560 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; | 1528 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; |
1561 | struct zfcp_fsf_req *req; | 1529 | struct zfcp_fsf_req *req; |
1562 | int retval = -EIO; | 1530 | int retval = -EIO; |
@@ -1566,6 +1534,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) | |||
1566 | goto out; | 1534 | goto out; |
1567 | 1535 | ||
1568 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT, | 1536 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT, |
1537 | SBAL_FLAGS0_TYPE_READ, | ||
1569 | qdio->adapter->pool.erp_req); | 1538 | qdio->adapter->pool.erp_req); |
1570 | 1539 | ||
1571 | if (IS_ERR(req)) { | 1540 | if (IS_ERR(req)) { |
@@ -1574,9 +1543,7 @@ int zfcp_fsf_close_port(struct zfcp_erp_action *erp_action) | |||
1574 | } | 1543 | } |
1575 | 1544 | ||
1576 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1545 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
1577 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1546 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1578 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1579 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1580 | 1547 | ||
1581 | req->handler = zfcp_fsf_close_port_handler; | 1548 | req->handler = zfcp_fsf_close_port_handler; |
1582 | req->data = erp_action->port; | 1549 | req->data = erp_action->port; |
@@ -1633,7 +1600,6 @@ out: | |||
1633 | */ | 1600 | */ |
1634 | int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) | 1601 | int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) |
1635 | { | 1602 | { |
1636 | struct qdio_buffer_element *sbale; | ||
1637 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; | 1603 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
1638 | struct zfcp_fsf_req *req; | 1604 | struct zfcp_fsf_req *req; |
1639 | int retval = -EIO; | 1605 | int retval = -EIO; |
@@ -1643,6 +1609,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) | |||
1643 | goto out; | 1609 | goto out; |
1644 | 1610 | ||
1645 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID, | 1611 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_PORT_WITH_DID, |
1612 | SBAL_FLAGS0_TYPE_READ, | ||
1646 | qdio->adapter->pool.erp_req); | 1613 | qdio->adapter->pool.erp_req); |
1647 | 1614 | ||
1648 | if (unlikely(IS_ERR(req))) { | 1615 | if (unlikely(IS_ERR(req))) { |
@@ -1651,9 +1618,7 @@ int zfcp_fsf_open_wka_port(struct zfcp_fc_wka_port *wka_port) | |||
1651 | } | 1618 | } |
1652 | 1619 | ||
1653 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1620 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
1654 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1621 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1655 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1656 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1657 | 1622 | ||
1658 | req->handler = zfcp_fsf_open_wka_port_handler; | 1623 | req->handler = zfcp_fsf_open_wka_port_handler; |
1659 | hton24(req->qtcb->bottom.support.d_id, wka_port->d_id); | 1624 | hton24(req->qtcb->bottom.support.d_id, wka_port->d_id); |
@@ -1688,7 +1653,6 @@ static void zfcp_fsf_close_wka_port_handler(struct zfcp_fsf_req *req) | |||
1688 | */ | 1653 | */ |
1689 | int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) | 1654 | int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) |
1690 | { | 1655 | { |
1691 | struct qdio_buffer_element *sbale; | ||
1692 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; | 1656 | struct zfcp_qdio *qdio = wka_port->adapter->qdio; |
1693 | struct zfcp_fsf_req *req; | 1657 | struct zfcp_fsf_req *req; |
1694 | int retval = -EIO; | 1658 | int retval = -EIO; |
@@ -1698,6 +1662,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) | |||
1698 | goto out; | 1662 | goto out; |
1699 | 1663 | ||
1700 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT, | 1664 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PORT, |
1665 | SBAL_FLAGS0_TYPE_READ, | ||
1701 | qdio->adapter->pool.erp_req); | 1666 | qdio->adapter->pool.erp_req); |
1702 | 1667 | ||
1703 | if (unlikely(IS_ERR(req))) { | 1668 | if (unlikely(IS_ERR(req))) { |
@@ -1706,9 +1671,7 @@ int zfcp_fsf_close_wka_port(struct zfcp_fc_wka_port *wka_port) | |||
1706 | } | 1671 | } |
1707 | 1672 | ||
1708 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1673 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
1709 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1674 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1710 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1711 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1712 | 1675 | ||
1713 | req->handler = zfcp_fsf_close_wka_port_handler; | 1676 | req->handler = zfcp_fsf_close_wka_port_handler; |
1714 | req->data = wka_port; | 1677 | req->data = wka_port; |
@@ -1782,7 +1745,6 @@ static void zfcp_fsf_close_physical_port_handler(struct zfcp_fsf_req *req) | |||
1782 | */ | 1745 | */ |
1783 | int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) | 1746 | int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) |
1784 | { | 1747 | { |
1785 | struct qdio_buffer_element *sbale; | ||
1786 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; | 1748 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; |
1787 | struct zfcp_fsf_req *req; | 1749 | struct zfcp_fsf_req *req; |
1788 | int retval = -EIO; | 1750 | int retval = -EIO; |
@@ -1792,6 +1754,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) | |||
1792 | goto out; | 1754 | goto out; |
1793 | 1755 | ||
1794 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PHYSICAL_PORT, | 1756 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_PHYSICAL_PORT, |
1757 | SBAL_FLAGS0_TYPE_READ, | ||
1795 | qdio->adapter->pool.erp_req); | 1758 | qdio->adapter->pool.erp_req); |
1796 | 1759 | ||
1797 | if (IS_ERR(req)) { | 1760 | if (IS_ERR(req)) { |
@@ -1800,9 +1763,7 @@ int zfcp_fsf_close_physical_port(struct zfcp_erp_action *erp_action) | |||
1800 | } | 1763 | } |
1801 | 1764 | ||
1802 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1765 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
1803 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1766 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1804 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1805 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1806 | 1767 | ||
1807 | req->data = erp_action->port; | 1768 | req->data = erp_action->port; |
1808 | req->qtcb->header.port_handle = erp_action->port->handle; | 1769 | req->qtcb->header.port_handle = erp_action->port->handle; |
@@ -1954,7 +1915,6 @@ static void zfcp_fsf_open_unit_handler(struct zfcp_fsf_req *req) | |||
1954 | */ | 1915 | */ |
1955 | int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) | 1916 | int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) |
1956 | { | 1917 | { |
1957 | struct qdio_buffer_element *sbale; | ||
1958 | struct zfcp_adapter *adapter = erp_action->adapter; | 1918 | struct zfcp_adapter *adapter = erp_action->adapter; |
1959 | struct zfcp_qdio *qdio = adapter->qdio; | 1919 | struct zfcp_qdio *qdio = adapter->qdio; |
1960 | struct zfcp_fsf_req *req; | 1920 | struct zfcp_fsf_req *req; |
@@ -1965,6 +1925,7 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) | |||
1965 | goto out; | 1925 | goto out; |
1966 | 1926 | ||
1967 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_LUN, | 1927 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_OPEN_LUN, |
1928 | SBAL_FLAGS0_TYPE_READ, | ||
1968 | adapter->pool.erp_req); | 1929 | adapter->pool.erp_req); |
1969 | 1930 | ||
1970 | if (IS_ERR(req)) { | 1931 | if (IS_ERR(req)) { |
@@ -1973,9 +1934,7 @@ int zfcp_fsf_open_unit(struct zfcp_erp_action *erp_action) | |||
1973 | } | 1934 | } |
1974 | 1935 | ||
1975 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 1936 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
1976 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 1937 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
1977 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
1978 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
1979 | 1938 | ||
1980 | req->qtcb->header.port_handle = erp_action->port->handle; | 1939 | req->qtcb->header.port_handle = erp_action->port->handle; |
1981 | req->qtcb->bottom.support.fcp_lun = erp_action->unit->fcp_lun; | 1940 | req->qtcb->bottom.support.fcp_lun = erp_action->unit->fcp_lun; |
@@ -2041,7 +2000,6 @@ static void zfcp_fsf_close_unit_handler(struct zfcp_fsf_req *req) | |||
2041 | */ | 2000 | */ |
2042 | int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action) | 2001 | int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action) |
2043 | { | 2002 | { |
2044 | struct qdio_buffer_element *sbale; | ||
2045 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; | 2003 | struct zfcp_qdio *qdio = erp_action->adapter->qdio; |
2046 | struct zfcp_fsf_req *req; | 2004 | struct zfcp_fsf_req *req; |
2047 | int retval = -EIO; | 2005 | int retval = -EIO; |
@@ -2051,6 +2009,7 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action) | |||
2051 | goto out; | 2009 | goto out; |
2052 | 2010 | ||
2053 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_LUN, | 2011 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_CLOSE_LUN, |
2012 | SBAL_FLAGS0_TYPE_READ, | ||
2054 | qdio->adapter->pool.erp_req); | 2013 | qdio->adapter->pool.erp_req); |
2055 | 2014 | ||
2056 | if (IS_ERR(req)) { | 2015 | if (IS_ERR(req)) { |
@@ -2059,9 +2018,7 @@ int zfcp_fsf_close_unit(struct zfcp_erp_action *erp_action) | |||
2059 | } | 2018 | } |
2060 | 2019 | ||
2061 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 2020 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
2062 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 2021 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
2063 | sbale[0].flags |= SBAL_FLAGS0_TYPE_READ; | ||
2064 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
2065 | 2022 | ||
2066 | req->qtcb->header.port_handle = erp_action->port->handle; | 2023 | req->qtcb->header.port_handle = erp_action->port->handle; |
2067 | req->qtcb->header.lun_handle = erp_action->unit->handle; | 2024 | req->qtcb->header.lun_handle = erp_action->unit->handle; |
@@ -2289,8 +2246,11 @@ int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *unit, | |||
2289 | goto out; | 2246 | goto out; |
2290 | } | 2247 | } |
2291 | 2248 | ||
2249 | if (scsi_cmnd->sc_data_direction == DMA_TO_DEVICE) | ||
2250 | sbtype = SBAL_FLAGS0_TYPE_WRITE; | ||
2251 | |||
2292 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND, | 2252 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND, |
2293 | adapter->pool.scsi_req); | 2253 | sbtype, adapter->pool.scsi_req); |
2294 | 2254 | ||
2295 | if (IS_ERR(req)) { | 2255 | if (IS_ERR(req)) { |
2296 | retval = PTR_ERR(req); | 2256 | retval = PTR_ERR(req); |
@@ -2298,7 +2258,6 @@ int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *unit, | |||
2298 | } | 2258 | } |
2299 | 2259 | ||
2300 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; | 2260 | req->status |= ZFCP_STATUS_FSFREQ_CLEANUP; |
2301 | get_device(&unit->dev); | ||
2302 | req->unit = unit; | 2261 | req->unit = unit; |
2303 | req->data = scsi_cmnd; | 2262 | req->data = scsi_cmnd; |
2304 | req->handler = zfcp_fsf_send_fcp_command_handler; | 2263 | req->handler = zfcp_fsf_send_fcp_command_handler; |
@@ -2323,20 +2282,21 @@ int zfcp_fsf_send_fcp_command_task(struct zfcp_unit *unit, | |||
2323 | break; | 2282 | break; |
2324 | case DMA_TO_DEVICE: | 2283 | case DMA_TO_DEVICE: |
2325 | req->qtcb->bottom.io.data_direction = FSF_DATADIR_WRITE; | 2284 | req->qtcb->bottom.io.data_direction = FSF_DATADIR_WRITE; |
2326 | sbtype = SBAL_FLAGS0_TYPE_WRITE; | ||
2327 | break; | 2285 | break; |
2328 | case DMA_BIDIRECTIONAL: | 2286 | case DMA_BIDIRECTIONAL: |
2329 | goto failed_scsi_cmnd; | 2287 | goto failed_scsi_cmnd; |
2330 | } | 2288 | } |
2331 | 2289 | ||
2290 | get_device(&unit->dev); | ||
2291 | |||
2332 | fcp_cmnd = (struct fcp_cmnd *) &req->qtcb->bottom.io.fcp_cmnd; | 2292 | fcp_cmnd = (struct fcp_cmnd *) &req->qtcb->bottom.io.fcp_cmnd; |
2333 | zfcp_fc_scsi_to_fcp(fcp_cmnd, scsi_cmnd); | 2293 | zfcp_fc_scsi_to_fcp(fcp_cmnd, scsi_cmnd); |
2334 | 2294 | ||
2335 | real_bytes = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, sbtype, | 2295 | real_bytes = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, |
2336 | scsi_sglist(scsi_cmnd), | 2296 | scsi_sglist(scsi_cmnd), |
2337 | FSF_MAX_SBALS_PER_REQ); | 2297 | ZFCP_FSF_MAX_SBALS_PER_REQ); |
2338 | if (unlikely(real_bytes < 0)) { | 2298 | if (unlikely(real_bytes < 0)) { |
2339 | if (req->qdio_req.sbal_number >= FSF_MAX_SBALS_PER_REQ) { | 2299 | if (req->qdio_req.sbal_number >= ZFCP_FSF_MAX_SBALS_PER_REQ) { |
2340 | dev_err(&adapter->ccw_device->dev, | 2300 | dev_err(&adapter->ccw_device->dev, |
2341 | "Oversize data package, unit 0x%016Lx " | 2301 | "Oversize data package, unit 0x%016Lx " |
2342 | "on port 0x%016Lx closed\n", | 2302 | "on port 0x%016Lx closed\n", |
@@ -2371,7 +2331,6 @@ out: | |||
2371 | */ | 2331 | */ |
2372 | struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_unit *unit, u8 tm_flags) | 2332 | struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_unit *unit, u8 tm_flags) |
2373 | { | 2333 | { |
2374 | struct qdio_buffer_element *sbale; | ||
2375 | struct zfcp_fsf_req *req = NULL; | 2334 | struct zfcp_fsf_req *req = NULL; |
2376 | struct fcp_cmnd *fcp_cmnd; | 2335 | struct fcp_cmnd *fcp_cmnd; |
2377 | struct zfcp_qdio *qdio = unit->port->adapter->qdio; | 2336 | struct zfcp_qdio *qdio = unit->port->adapter->qdio; |
@@ -2385,6 +2344,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_unit *unit, u8 tm_flags) | |||
2385 | goto out; | 2344 | goto out; |
2386 | 2345 | ||
2387 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND, | 2346 | req = zfcp_fsf_req_create(qdio, FSF_QTCB_FCP_CMND, |
2347 | SBAL_FLAGS0_TYPE_WRITE, | ||
2388 | qdio->adapter->pool.scsi_req); | 2348 | qdio->adapter->pool.scsi_req); |
2389 | 2349 | ||
2390 | if (IS_ERR(req)) { | 2350 | if (IS_ERR(req)) { |
@@ -2401,9 +2361,7 @@ struct zfcp_fsf_req *zfcp_fsf_send_fcp_ctm(struct zfcp_unit *unit, u8 tm_flags) | |||
2401 | req->qtcb->bottom.io.service_class = FSF_CLASS_3; | 2361 | req->qtcb->bottom.io.service_class = FSF_CLASS_3; |
2402 | req->qtcb->bottom.io.fcp_cmnd_length = FCP_CMND_LEN; | 2362 | req->qtcb->bottom.io.fcp_cmnd_length = FCP_CMND_LEN; |
2403 | 2363 | ||
2404 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | 2364 | zfcp_qdio_set_sbale_last(qdio, &req->qdio_req); |
2405 | sbale[0].flags |= SBAL_FLAGS0_TYPE_WRITE; | ||
2406 | sbale[1].flags |= SBAL_FLAGS_LAST_ENTRY; | ||
2407 | 2365 | ||
2408 | fcp_cmnd = (struct fcp_cmnd *) &req->qtcb->bottom.io.fcp_cmnd; | 2366 | fcp_cmnd = (struct fcp_cmnd *) &req->qtcb->bottom.io.fcp_cmnd; |
2409 | zfcp_fc_fcp_tm(fcp_cmnd, unit->device, tm_flags); | 2367 | zfcp_fc_fcp_tm(fcp_cmnd, unit->device, tm_flags); |
@@ -2432,7 +2390,6 @@ static void zfcp_fsf_control_file_handler(struct zfcp_fsf_req *req) | |||
2432 | struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter, | 2390 | struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter, |
2433 | struct zfcp_fsf_cfdc *fsf_cfdc) | 2391 | struct zfcp_fsf_cfdc *fsf_cfdc) |
2434 | { | 2392 | { |
2435 | struct qdio_buffer_element *sbale; | ||
2436 | struct zfcp_qdio *qdio = adapter->qdio; | 2393 | struct zfcp_qdio *qdio = adapter->qdio; |
2437 | struct zfcp_fsf_req *req = NULL; | 2394 | struct zfcp_fsf_req *req = NULL; |
2438 | struct fsf_qtcb_bottom_support *bottom; | 2395 | struct fsf_qtcb_bottom_support *bottom; |
@@ -2456,7 +2413,7 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter, | |||
2456 | if (zfcp_fsf_req_sbal_get(qdio)) | 2413 | if (zfcp_fsf_req_sbal_get(qdio)) |
2457 | goto out; | 2414 | goto out; |
2458 | 2415 | ||
2459 | req = zfcp_fsf_req_create(qdio, fsf_cfdc->command, NULL); | 2416 | req = zfcp_fsf_req_create(qdio, fsf_cfdc->command, direction, NULL); |
2460 | if (IS_ERR(req)) { | 2417 | if (IS_ERR(req)) { |
2461 | retval = -EPERM; | 2418 | retval = -EPERM; |
2462 | goto out; | 2419 | goto out; |
@@ -2464,16 +2421,13 @@ struct zfcp_fsf_req *zfcp_fsf_control_file(struct zfcp_adapter *adapter, | |||
2464 | 2421 | ||
2465 | req->handler = zfcp_fsf_control_file_handler; | 2422 | req->handler = zfcp_fsf_control_file_handler; |
2466 | 2423 | ||
2467 | sbale = zfcp_qdio_sbale_req(qdio, &req->qdio_req); | ||
2468 | sbale[0].flags |= direction; | ||
2469 | |||
2470 | bottom = &req->qtcb->bottom.support; | 2424 | bottom = &req->qtcb->bottom.support; |
2471 | bottom->operation_subtype = FSF_CFDC_OPERATION_SUBTYPE; | 2425 | bottom->operation_subtype = FSF_CFDC_OPERATION_SUBTYPE; |
2472 | bottom->option = fsf_cfdc->option; | 2426 | bottom->option = fsf_cfdc->option; |
2473 | 2427 | ||
2474 | bytes = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, | 2428 | bytes = zfcp_qdio_sbals_from_sg(qdio, &req->qdio_req, |
2475 | direction, fsf_cfdc->sg, | 2429 | fsf_cfdc->sg, |
2476 | FSF_MAX_SBALS_PER_REQ); | 2430 | ZFCP_FSF_MAX_SBALS_PER_REQ); |
2477 | if (bytes != ZFCP_CFDC_MAX_SIZE) { | 2431 | if (bytes != ZFCP_CFDC_MAX_SIZE) { |
2478 | zfcp_fsf_req_free(req); | 2432 | zfcp_fsf_req_free(req); |
2479 | goto out; | 2433 | goto out; |
diff --git a/drivers/s390/scsi/zfcp_fsf.h b/drivers/s390/scsi/zfcp_fsf.h index b3de682b64cf..4008bd786793 100644 --- a/drivers/s390/scsi/zfcp_fsf.h +++ b/drivers/s390/scsi/zfcp_fsf.h | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Interface to the FSF support functions. | 4 | * Interface to the FSF support functions. |
5 | * | 5 | * |
6 | * Copyright IBM Corporation 2002, 2009 | 6 | * Copyright IBM Corporation 2002, 2010 |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #ifndef FSF_H | 9 | #ifndef FSF_H |
@@ -152,7 +152,12 @@ | |||
152 | #define FSF_CLASS_3 0x00000003 | 152 | #define FSF_CLASS_3 0x00000003 |
153 | 153 | ||
154 | /* SBAL chaining */ | 154 | /* SBAL chaining */ |
155 | #define FSF_MAX_SBALS_PER_REQ 36 | 155 | #define ZFCP_FSF_MAX_SBALS_PER_REQ 36 |
156 | |||
157 | /* max. number of (data buffer) SBALEs in largest SBAL chain | ||
158 | * request ID + QTCB in SBALE 0 + 1 of first SBAL in chain */ | ||
159 | #define ZFCP_FSF_MAX_SBALES_PER_REQ \ | ||
160 | (ZFCP_FSF_MAX_SBALS_PER_REQ * ZFCP_QDIO_MAX_SBALES_PER_SBAL - 2) | ||
156 | 161 | ||
157 | /* logging space behind QTCB */ | 162 | /* logging space behind QTCB */ |
158 | #define FSF_QTCB_LOG_SIZE 1024 | 163 | #define FSF_QTCB_LOG_SIZE 1024 |
diff --git a/drivers/s390/scsi/zfcp_qdio.c b/drivers/s390/scsi/zfcp_qdio.c index aa68515abe21..98d54a9cd563 100644 --- a/drivers/s390/scsi/zfcp_qdio.c +++ b/drivers/s390/scsi/zfcp_qdio.c | |||
@@ -3,7 +3,7 @@ | |||
3 | * | 3 | * |
4 | * Setup and helper functions to access QDIO. | 4 | * Setup and helper functions to access QDIO. |
5 | * | 5 | * |
6 | * Copyright IBM Corporation 2002, 2009 | 6 | * Copyright IBM Corporation 2002, 2010 |
7 | */ | 7 | */ |
8 | 8 | ||
9 | #define KMSG_COMPONENT "zfcp" | 9 | #define KMSG_COMPONENT "zfcp" |
@@ -151,8 +151,7 @@ static void zfcp_qdio_sbal_limit(struct zfcp_qdio *qdio, | |||
151 | } | 151 | } |
152 | 152 | ||
153 | static struct qdio_buffer_element * | 153 | static struct qdio_buffer_element * |
154 | zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, | 154 | zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) |
155 | unsigned long sbtype) | ||
156 | { | 155 | { |
157 | struct qdio_buffer_element *sbale; | 156 | struct qdio_buffer_element *sbale; |
158 | 157 | ||
@@ -180,17 +179,16 @@ zfcp_qdio_sbal_chain(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, | |||
180 | 179 | ||
181 | /* set storage-block type for new SBAL */ | 180 | /* set storage-block type for new SBAL */ |
182 | sbale = zfcp_qdio_sbale_curr(qdio, q_req); | 181 | sbale = zfcp_qdio_sbale_curr(qdio, q_req); |
183 | sbale->flags |= sbtype; | 182 | sbale->flags |= q_req->sbtype; |
184 | 183 | ||
185 | return sbale; | 184 | return sbale; |
186 | } | 185 | } |
187 | 186 | ||
188 | static struct qdio_buffer_element * | 187 | static struct qdio_buffer_element * |
189 | zfcp_qdio_sbale_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, | 188 | zfcp_qdio_sbale_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) |
190 | unsigned int sbtype) | ||
191 | { | 189 | { |
192 | if (q_req->sbale_curr == ZFCP_LAST_SBALE_PER_SBAL) | 190 | if (q_req->sbale_curr == ZFCP_QDIO_LAST_SBALE_PER_SBAL) |
193 | return zfcp_qdio_sbal_chain(qdio, q_req, sbtype); | 191 | return zfcp_qdio_sbal_chain(qdio, q_req); |
194 | q_req->sbale_curr++; | 192 | q_req->sbale_curr++; |
195 | return zfcp_qdio_sbale_curr(qdio, q_req); | 193 | return zfcp_qdio_sbale_curr(qdio, q_req); |
196 | } | 194 | } |
@@ -208,15 +206,14 @@ static void zfcp_qdio_undo_sbals(struct zfcp_qdio *qdio, | |||
208 | 206 | ||
209 | /** | 207 | /** |
210 | * zfcp_qdio_sbals_from_sg - fill SBALs from scatter-gather list | 208 | * zfcp_qdio_sbals_from_sg - fill SBALs from scatter-gather list |
211 | * @fsf_req: request to be processed | 209 | * @qdio: pointer to struct zfcp_qdio |
212 | * @sbtype: SBALE flags | 210 | * @q_req: pointer to struct zfcp_qdio_req |
213 | * @sg: scatter-gather list | 211 | * @sg: scatter-gather list |
214 | * @max_sbals: upper bound for number of SBALs to be used | 212 | * @max_sbals: upper bound for number of SBALs to be used |
215 | * Returns: number of bytes, or error (negativ) | 213 | * Returns: number of bytes, or error (negativ) |
216 | */ | 214 | */ |
217 | int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, | 215 | int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, |
218 | unsigned long sbtype, struct scatterlist *sg, | 216 | struct scatterlist *sg, int max_sbals) |
219 | int max_sbals) | ||
220 | { | 217 | { |
221 | struct qdio_buffer_element *sbale; | 218 | struct qdio_buffer_element *sbale; |
222 | int bytes = 0; | 219 | int bytes = 0; |
@@ -226,10 +223,10 @@ int zfcp_qdio_sbals_from_sg(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, | |||
226 | 223 | ||
227 | /* set storage-block type for this request */ | 224 | /* set storage-block type for this request */ |
228 | sbale = zfcp_qdio_sbale_req(qdio, q_req); | 225 | sbale = zfcp_qdio_sbale_req(qdio, q_req); |
229 | sbale->flags |= sbtype; | 226 | sbale->flags |= q_req->sbtype; |
230 | 227 | ||
231 | for (; sg; sg = sg_next(sg)) { | 228 | for (; sg; sg = sg_next(sg)) { |
232 | sbale = zfcp_qdio_sbale_next(qdio, q_req, sbtype); | 229 | sbale = zfcp_qdio_sbale_next(qdio, q_req); |
233 | if (!sbale) { | 230 | if (!sbale) { |
234 | atomic_inc(&qdio->req_q_full); | 231 | atomic_inc(&qdio->req_q_full); |
235 | zfcp_qdio_undo_sbals(qdio, q_req); | 232 | zfcp_qdio_undo_sbals(qdio, q_req); |
diff --git a/drivers/s390/scsi/zfcp_qdio.h b/drivers/s390/scsi/zfcp_qdio.h index f2b5a363bb84..138fba577b48 100644 --- a/drivers/s390/scsi/zfcp_qdio.h +++ b/drivers/s390/scsi/zfcp_qdio.h | |||
@@ -13,6 +13,12 @@ | |||
13 | 13 | ||
14 | #define ZFCP_QDIO_SBALE_LEN PAGE_SIZE | 14 | #define ZFCP_QDIO_SBALE_LEN PAGE_SIZE |
15 | 15 | ||
16 | /* DMQ bug workaround: don't use last SBALE */ | ||
17 | #define ZFCP_QDIO_MAX_SBALES_PER_SBAL (QDIO_MAX_ELEMENTS_PER_BUFFER - 1) | ||
18 | |||
19 | /* index of last SBALE (with respect to DMQ bug workaround) */ | ||
20 | #define ZFCP_QDIO_LAST_SBALE_PER_SBAL (ZFCP_QDIO_MAX_SBALES_PER_SBAL - 1) | ||
21 | |||
16 | /** | 22 | /** |
17 | * struct zfcp_qdio_queue - qdio queue buffer, zfcp index and free count | 23 | * struct zfcp_qdio_queue - qdio queue buffer, zfcp index and free count |
18 | * @sbal: qdio buffers | 24 | * @sbal: qdio buffers |
@@ -51,6 +57,7 @@ struct zfcp_qdio { | |||
51 | 57 | ||
52 | /** | 58 | /** |
53 | * struct zfcp_qdio_req - qdio queue related values for a request | 59 | * struct zfcp_qdio_req - qdio queue related values for a request |
60 | * @sbtype: sbal type flags for sbale 0 | ||
54 | * @sbal_number: number of free sbals | 61 | * @sbal_number: number of free sbals |
55 | * @sbal_first: first sbal for this request | 62 | * @sbal_first: first sbal for this request |
56 | * @sbal_last: last sbal for this request | 63 | * @sbal_last: last sbal for this request |
@@ -61,6 +68,7 @@ struct zfcp_qdio { | |||
61 | * @qdio_inb_usage: usage of inbound queue | 68 | * @qdio_inb_usage: usage of inbound queue |
62 | */ | 69 | */ |
63 | struct zfcp_qdio_req { | 70 | struct zfcp_qdio_req { |
71 | u32 sbtype; | ||
64 | u8 sbal_number; | 72 | u8 sbal_number; |
65 | u8 sbal_first; | 73 | u8 sbal_first; |
66 | u8 sbal_last; | 74 | u8 sbal_last; |
@@ -108,4 +116,98 @@ zfcp_qdio_sbale_curr(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req) | |||
108 | q_req->sbale_curr); | 116 | q_req->sbale_curr); |
109 | } | 117 | } |
110 | 118 | ||
119 | /** | ||
120 | * zfcp_qdio_req_init - initialize qdio request | ||
121 | * @qdio: request queue where to start putting the request | ||
122 | * @q_req: the qdio request to start | ||
123 | * @req_id: The request id | ||
124 | * @sbtype: type flags to set for all sbals | ||
125 | * @data: First data block | ||
126 | * @len: Length of first data block | ||
127 | * | ||
128 | * This is the start of putting the request into the queue, the last | ||
129 | * step is passing the request to zfcp_qdio_send. The request queue | ||
130 | * lock must be held during the whole process from init to send. | ||
131 | */ | ||
132 | static inline | ||
133 | void zfcp_qdio_req_init(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, | ||
134 | unsigned long req_id, u32 sbtype, void *data, u32 len) | ||
135 | { | ||
136 | struct qdio_buffer_element *sbale; | ||
137 | |||
138 | q_req->sbal_first = q_req->sbal_last = qdio->req_q.first; | ||
139 | q_req->sbal_number = 1; | ||
140 | q_req->sbtype = sbtype; | ||
141 | |||
142 | sbale = zfcp_qdio_sbale_req(qdio, q_req); | ||
143 | sbale->addr = (void *) req_id; | ||
144 | sbale->flags |= SBAL_FLAGS0_COMMAND; | ||
145 | sbale->flags |= sbtype; | ||
146 | |||
147 | q_req->sbale_curr = 1; | ||
148 | sbale++; | ||
149 | sbale->addr = data; | ||
150 | if (likely(data)) | ||
151 | sbale->length = len; | ||
152 | } | ||
153 | |||
154 | /** | ||
155 | * zfcp_qdio_fill_next - Fill next sbale, only for single sbal requests | ||
156 | * @qdio: pointer to struct zfcp_qdio | ||
157 | * @q_req: pointer to struct zfcp_queue_req | ||
158 | * | ||
159 | * This is only required for single sbal requests, calling it when | ||
160 | * wrapping around to the next sbal is a bug. | ||
161 | */ | ||
162 | static inline | ||
163 | void zfcp_qdio_fill_next(struct zfcp_qdio *qdio, struct zfcp_qdio_req *q_req, | ||
164 | void *data, u32 len) | ||
165 | { | ||
166 | struct qdio_buffer_element *sbale; | ||
167 | |||
168 | BUG_ON(q_req->sbale_curr == ZFCP_QDIO_LAST_SBALE_PER_SBAL); | ||
169 | q_req->sbale_curr++; | ||
170 | sbale = zfcp_qdio_sbale_curr(qdio, q_req); | ||
171 | sbale->addr = data; | ||
172 | sbale->length = len; | ||
173 | } | ||
174 | |||
175 | /** | ||
176 | * zfcp_qdio_set_sbale_last - set last entry flag in current sbale | ||
177 | * @qdio: pointer to struct zfcp_qdio | ||
178 | * @q_req: pointer to struct zfcp_queue_req | ||
179 | */ | ||
180 | static inline | ||
181 | void zfcp_qdio_set_sbale_last(struct zfcp_qdio *qdio, | ||
182 | struct zfcp_qdio_req *q_req) | ||
183 | { | ||
184 | struct qdio_buffer_element *sbale; | ||
185 | |||
186 | sbale = zfcp_qdio_sbale_curr(qdio, q_req); | ||
187 | sbale->flags |= SBAL_FLAGS_LAST_ENTRY; | ||
188 | } | ||
189 | |||
190 | /** | ||
191 | * zfcp_qdio_sg_one_sbal - check if one sbale is enough for sg data | ||
192 | * @sg: The scatterlist where to check the data size | ||
193 | * | ||
194 | * Returns: 1 when one sbale is enough for the data in the scatterlist, | ||
195 | * 0 if not. | ||
196 | */ | ||
197 | static inline | ||
198 | int zfcp_qdio_sg_one_sbale(struct scatterlist *sg) | ||
199 | { | ||
200 | return sg_is_last(sg) && sg->length <= ZFCP_QDIO_SBALE_LEN; | ||
201 | } | ||
202 | |||
203 | /** | ||
204 | * zfcp_qdio_skip_to_last_sbale - skip to last sbale in sbal | ||
205 | * @q_req: The current zfcp_qdio_req | ||
206 | */ | ||
207 | static inline | ||
208 | void zfcp_qdio_skip_to_last_sbale(struct zfcp_qdio_req *q_req) | ||
209 | { | ||
210 | q_req->sbale_curr = ZFCP_QDIO_LAST_SBALE_PER_SBAL; | ||
211 | } | ||
212 | |||
111 | #endif /* ZFCP_QDIO_H */ | 213 | #endif /* ZFCP_QDIO_H */ |
diff --git a/drivers/s390/scsi/zfcp_scsi.c b/drivers/s390/scsi/zfcp_scsi.c index 066b0507a639..be5d2c60453d 100644 --- a/drivers/s390/scsi/zfcp_scsi.c +++ b/drivers/s390/scsi/zfcp_scsi.c | |||
@@ -677,11 +677,11 @@ struct zfcp_data zfcp_data = { | |||
677 | .eh_host_reset_handler = zfcp_scsi_eh_host_reset_handler, | 677 | .eh_host_reset_handler = zfcp_scsi_eh_host_reset_handler, |
678 | .can_queue = 4096, | 678 | .can_queue = 4096, |
679 | .this_id = -1, | 679 | .this_id = -1, |
680 | .sg_tablesize = ZFCP_MAX_SBALES_PER_REQ, | 680 | .sg_tablesize = ZFCP_FSF_MAX_SBALES_PER_REQ, |
681 | .cmd_per_lun = 1, | 681 | .cmd_per_lun = 1, |
682 | .use_clustering = 1, | 682 | .use_clustering = 1, |
683 | .sdev_attrs = zfcp_sysfs_sdev_attrs, | 683 | .sdev_attrs = zfcp_sysfs_sdev_attrs, |
684 | .max_sectors = (ZFCP_MAX_SBALES_PER_REQ * 8), | 684 | .max_sectors = (ZFCP_FSF_MAX_SBALES_PER_REQ * 8), |
685 | .dma_boundary = ZFCP_QDIO_SBALE_LEN - 1, | 685 | .dma_boundary = ZFCP_QDIO_SBALE_LEN - 1, |
686 | .shost_attrs = zfcp_sysfs_shost_attrs, | 686 | .shost_attrs = zfcp_sysfs_shost_attrs, |
687 | }, | 687 | }, |