@@ -1807,6 +1807,18 @@ static int qeth_idx_activate_get_answer(struct qeth_card *card,
1807
1807
return rc ;
1808
1808
}
1809
1809
1810
+ static void qeth_idx_finalize_cmd (struct qeth_card * card ,
1811
+ struct qeth_cmd_buffer * iob ,
1812
+ unsigned int length )
1813
+ {
1814
+ qeth_setup_ccw (iob -> channel -> ccw , CCW_CMD_WRITE , length , iob -> data );
1815
+
1816
+ memcpy (QETH_TRANSPORT_HEADER_SEQ_NO (iob -> data ), & card -> seqno .trans_hdr ,
1817
+ QETH_SEQ_NO_LENGTH );
1818
+ if (iob -> channel == & card -> write )
1819
+ card -> seqno .trans_hdr ++ ;
1820
+ }
1821
+
1810
1822
static int qeth_idx_activate_channel (struct qeth_card * card ,
1811
1823
struct qeth_channel * channel ,
1812
1824
void (* reply_cb )(struct qeth_card * ,
@@ -1825,18 +1837,12 @@ static int qeth_idx_activate_channel(struct qeth_card *card,
1825
1837
if (!iob )
1826
1838
return - ENOMEM ;
1827
1839
iob -> callback = reply_cb ;
1828
- qeth_setup_ccw (channel -> ccw , CCW_CMD_WRITE , IDX_ACTIVATE_SIZE ,
1829
- iob -> data );
1830
- if (channel == & card -> write ) {
1840
+
1841
+ if (channel == & card -> write )
1831
1842
memcpy (iob -> data , IDX_ACTIVATE_WRITE , IDX_ACTIVATE_SIZE );
1832
- memcpy (QETH_TRANSPORT_HEADER_SEQ_NO (iob -> data ),
1833
- & card -> seqno .trans_hdr , QETH_SEQ_NO_LENGTH );
1834
- card -> seqno .trans_hdr ++ ;
1835
- } else {
1843
+ else
1836
1844
memcpy (iob -> data , IDX_ACTIVATE_READ , IDX_ACTIVATE_SIZE );
1837
- memcpy (QETH_TRANSPORT_HEADER_SEQ_NO (iob -> data ),
1838
- & card -> seqno .trans_hdr , QETH_SEQ_NO_LENGTH );
1839
- }
1845
+
1840
1846
tmp = ((u8 )card -> dev -> dev_port ) | 0x80 ;
1841
1847
memcpy (QETH_IDX_ACT_PNO (iob -> data ), & tmp , 1 );
1842
1848
memcpy (QETH_IDX_ACT_ISSUER_RM_TOKEN (iob -> data ),
@@ -1850,6 +1856,8 @@ static int qeth_idx_activate_channel(struct qeth_card *card,
1850
1856
1851
1857
wait_event (card -> wait_q , qeth_trylock_channel (channel ));
1852
1858
QETH_DBF_TEXT (SETUP , 6 , "noirqpnd" );
1859
+ qeth_idx_finalize_cmd (card , iob , IDX_ACTIVATE_SIZE );
1860
+
1853
1861
spin_lock_irq (get_ccwdev_lock (channel -> ccwdev ));
1854
1862
rc = ccw_device_start_timeout (channel -> ccwdev , channel -> ccw ,
1855
1863
(addr_t ) iob , 0 , 0 , QETH_TIMEOUT );
@@ -1977,23 +1985,21 @@ static void qeth_idx_read_cb(struct qeth_card *card,
1977
1985
qeth_release_buffer (channel , iob );
1978
1986
}
1979
1987
1980
- void qeth_prepare_control_data (struct qeth_card * card , int len ,
1981
- struct qeth_cmd_buffer * iob )
1988
+ static void qeth_mpc_finalize_cmd (struct qeth_card * card ,
1989
+ struct qeth_cmd_buffer * iob ,
1990
+ unsigned int length )
1982
1991
{
1983
- qeth_setup_ccw (iob -> channel -> ccw , CCW_CMD_WRITE , len , iob -> data );
1984
- iob -> callback = qeth_release_buffer_cb ;
1992
+ qeth_idx_finalize_cmd (card , iob , length );
1985
1993
1986
- memcpy (QETH_TRANSPORT_HEADER_SEQ_NO (iob -> data ),
1987
- & card -> seqno .trans_hdr , QETH_SEQ_NO_LENGTH );
1988
- card -> seqno .trans_hdr ++ ;
1989
1994
memcpy (QETH_PDU_HEADER_SEQ_NO (iob -> data ),
1990
1995
& card -> seqno .pdu_hdr , QETH_SEQ_NO_LENGTH );
1991
1996
card -> seqno .pdu_hdr ++ ;
1992
1997
memcpy (QETH_PDU_HEADER_ACK_SEQ_NO (iob -> data ),
1993
1998
& card -> seqno .pdu_hdr_ack , QETH_SEQ_NO_LENGTH );
1994
- QETH_DBF_HEX (CTRL , 2 , iob -> data , min (len , QETH_DBF_CTRL_LEN ));
1999
+
2000
+ iob -> reply -> seqno = QETH_IDX_COMMAND_SEQNO ;
2001
+ iob -> callback = qeth_release_buffer_cb ;
1995
2002
}
1996
- EXPORT_SYMBOL_GPL (qeth_prepare_control_data );
1997
2003
1998
2004
/**
1999
2005
* qeth_send_control_data() - send control command to the card
@@ -2029,7 +2035,6 @@ static int qeth_send_control_data(struct qeth_card *card, int len,
2029
2035
long timeout = iob -> timeout ;
2030
2036
int rc ;
2031
2037
struct qeth_reply * reply = NULL ;
2032
- struct qeth_ipa_cmd * cmd = NULL ;
2033
2038
2034
2039
QETH_CARD_TEXT (card , 2 , "sendctl" );
2035
2040
@@ -2058,14 +2063,8 @@ static int qeth_send_control_data(struct qeth_card *card, int len,
2058
2063
return (timeout == - ERESTARTSYS ) ? - EINTR : - ETIME ;
2059
2064
}
2060
2065
2061
- if (IS_IPA (iob -> data )) {
2062
- cmd = __ipa_cmd (iob );
2063
- cmd -> hdr .seqno = card -> seqno .ipa ++ ;
2064
- reply -> seqno = cmd -> hdr .seqno ;
2065
- } else {
2066
- reply -> seqno = QETH_IDX_COMMAND_SEQNO ;
2067
- }
2068
- qeth_prepare_control_data (card , len , iob );
2066
+ iob -> finalize (card , iob , len );
2067
+ QETH_DBF_HEX (CTRL , 2 , iob -> data , min (len , QETH_DBF_CTRL_LEN ));
2069
2068
2070
2069
qeth_enqueue_reply (card , reply );
2071
2070
@@ -2120,7 +2119,9 @@ static int qeth_cm_enable(struct qeth_card *card)
2120
2119
QETH_DBF_TEXT (SETUP , 2 , "cmenable" );
2121
2120
2122
2121
iob = qeth_wait_for_buffer (& card -> write );
2122
+ iob -> finalize = qeth_mpc_finalize_cmd ;
2123
2123
memcpy (iob -> data , CM_ENABLE , CM_ENABLE_SIZE );
2124
+
2124
2125
memcpy (QETH_CM_ENABLE_ISSUER_RM_TOKEN (iob -> data ),
2125
2126
& card -> token .issuer_rm_r , QETH_MPC_TOKEN_LENGTH );
2126
2127
memcpy (QETH_CM_ENABLE_FILTER_TOKEN (iob -> data ),
@@ -2153,7 +2154,9 @@ static int qeth_cm_setup(struct qeth_card *card)
2153
2154
QETH_DBF_TEXT (SETUP , 2 , "cmsetup" );
2154
2155
2155
2156
iob = qeth_wait_for_buffer (& card -> write );
2157
+ iob -> finalize = qeth_mpc_finalize_cmd ;
2156
2158
memcpy (iob -> data , CM_SETUP , CM_SETUP_SIZE );
2159
+
2157
2160
memcpy (QETH_CM_SETUP_DEST_ADDR (iob -> data ),
2158
2161
& card -> token .issuer_rm_r , QETH_MPC_TOKEN_LENGTH );
2159
2162
memcpy (QETH_CM_SETUP_CONNECTION_TOKEN (iob -> data ),
@@ -2270,6 +2273,7 @@ static int qeth_ulp_enable(struct qeth_card *card)
2270
2273
QETH_DBF_TEXT (SETUP , 2 , "ulpenabl" );
2271
2274
2272
2275
iob = qeth_wait_for_buffer (& card -> write );
2276
+ iob -> finalize = qeth_mpc_finalize_cmd ;
2273
2277
memcpy (iob -> data , ULP_ENABLE , ULP_ENABLE_SIZE );
2274
2278
2275
2279
* (QETH_ULP_ENABLE_LINKNUM (iob -> data )) = (u8 ) card -> dev -> dev_port ;
@@ -2316,6 +2320,7 @@ static int qeth_ulp_setup(struct qeth_card *card)
2316
2320
QETH_DBF_TEXT (SETUP , 2 , "ulpsetup" );
2317
2321
2318
2322
iob = qeth_wait_for_buffer (& card -> write );
2323
+ iob -> finalize = qeth_mpc_finalize_cmd ;
2319
2324
memcpy (iob -> data , ULP_SETUP , ULP_SETUP_SIZE );
2320
2325
2321
2326
memcpy (QETH_ULP_SETUP_DEST_ADDR (iob -> data ),
@@ -2503,6 +2508,7 @@ static int qeth_dm_act(struct qeth_card *card)
2503
2508
QETH_DBF_TEXT (SETUP , 2 , "dmact" );
2504
2509
2505
2510
iob = qeth_wait_for_buffer (& card -> write );
2511
+ iob -> finalize = qeth_mpc_finalize_cmd ;
2506
2512
memcpy (iob -> data , DM_ACT , DM_ACT_SIZE );
2507
2513
2508
2514
memcpy (QETH_DM_ACT_DEST_ADDR (iob -> data ),
@@ -2785,12 +2791,24 @@ static void qeth_fill_ipacmd_header(struct qeth_card *card,
2785
2791
cmd -> hdr .prot_version = prot ;
2786
2792
}
2787
2793
2794
+ static void qeth_ipa_finalize_cmd (struct qeth_card * card ,
2795
+ struct qeth_cmd_buffer * iob ,
2796
+ unsigned int length )
2797
+ {
2798
+ qeth_mpc_finalize_cmd (card , iob , length );
2799
+
2800
+ /* override with IPA-specific values: */
2801
+ __ipa_cmd (iob )-> hdr .seqno = card -> seqno .ipa ;
2802
+ iob -> reply -> seqno = card -> seqno .ipa ++ ;
2803
+ }
2804
+
2788
2805
void qeth_prepare_ipa_cmd (struct qeth_card * card , struct qeth_cmd_buffer * iob ,
2789
2806
u16 cmd_length )
2790
2807
{
2791
2808
u16 total_length = IPA_PDU_HEADER_SIZE + cmd_length ;
2792
2809
u8 prot_type = qeth_mpc_select_prot_type (card );
2793
2810
2811
+ iob -> finalize = qeth_ipa_finalize_cmd ;
2794
2812
iob -> timeout = QETH_IPA_TIMEOUT ;
2795
2813
2796
2814
memcpy (iob -> data , IPA_PDU_HEADER , IPA_PDU_HEADER_SIZE );
0 commit comments